<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MySQL Connector/J</title>
<link rel="stylesheet" type="text/css" href="mysql-html.css">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<script language="javascript" type="text/javascript">
  function addOnload(theFunc)
  {
    var previous = window.onload;
    if (typeof window.onload != 'function')
    {
      window.onload = theFunc;
    }
    else
    {
      window.onload = function()
      {
        previous();
        theFunc();
      }
    }
  }

  addOnload(function()
  {
    var base = new Date(1346870101*1000);
    var now = new Date();
    var diff = ((now-base)/1000)/(24*3600);

    if (diff > 90) {
      var nodes = document.getElementsByClassName('titlepage');
      nodes[0].innerHTML = '<p style="border: 5px #ff0000 solid; padding: 5px; margin 5px">' +
        'This copy of the manual is more than 90 days old. We encourage you to download a ' +
        'new version from <a href="http://dev.mysql.com">dev.mysql.com/doc</a>.</p>' + nodes[0].innerHTML;
    }
  });
</script>
<noscript></noscript>
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084"
	alink="#0000FF">
	<div lang="en" class="book">
		<div class="titlepage">
			<div>
				<div>
					<h1 class="title">
						<a name="connectors"></a>MySQL Connector/J
					</h1>
				</div>
				<div>
					<div class="abstract">
						<p class="title">
							<b>Abstract</b>
						</p>
						<p>This manual describes MySQL Connector/J, the JDBC
							implementation for communicating with MySQL servers.</p>
						<p>Document generated on: 2012-09-05 (revision: 32081)</p>
					</div>
				</div>
			</div>
			<hr>
		</div>
		<div class="toc">
			<p>
				<b>Table of Contents</b>
			</p>
			<dl>
				<dt>
					<span class="preface"><a href="#preface">Preface and
							Legal Notices</a></span>
				</dt>
				<dt>
					<span class="chapter"><a href="#connector-j">1. MySQL
							Connector/J</a></span>
				</dt>
				<dt>
					<span class="chapter"><a href="#connector-j-versions">2.
							Connector/J Versions</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a href="#connector-j-versions-java">2.1.
									Java Versions Supported</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a href="#connector-j-installing">3.
							Connector/J Installation</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-binary-installation">3.1. Installing
									Connector/J from a Binary Distribution</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-classpath">3.2. Installing the
									Driver and Configuring the <code class="literal">CLASSPATH</code>
							</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-upgrading">3.3. Upgrading from
									an Older Version</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a
										href="#connector-j-installing-upgrading-5-1">3.3.1.
											Upgrading to MySQL Connector/J 5.1.x</a></span>
								</dt>
								<dt>
									<span class="section"><a
										href="#connector-j-installing-upgrading-issues">3.3.2.
											JDBC-Specific Issues When Upgrading to MySQL Server 4.1 or
											Newer</a></span>
								</dt>
								<dt>
									<span class="section"><a
										href="#connector-j-installing-upgrading-3-0-to-3-1">3.3.3.
											Upgrading from MySQL Connector/J 3.0 to 3.1</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-source">3.4. Installing from
									the Development Source Tree</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a href="#connector-j-examples">4.
							Connector/J Examples</a></span>
				</dt>
				<dt>
					<span class="chapter"><a href="#connector-j-reference">5.
							Connector/J (JDBC) Reference</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-configuration-properties">5.1.
									Driver/Datasource Class Names, URL Syntax and Configuration
									Properties for Connector/J</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#connector-j-useconfigs">5.1.1.
											Properties Files for the <code class="literal">useConfigs</code>
											Option
									</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-implementation-notes">5.2. JDBC
									API Implementation Notes</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-type-conversions">5.3. Java,
									JDBC and MySQL Types</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-charsets">5.4. Using Character
									Sets and Unicode</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-using-ssl">5.5. Connecting
									Securely Using SSL</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#connector-j-using-pam">5.6.
									Connecting Using PAM Authentication</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-replication-connection">5.7.
									Using Master/Slave Replication with ReplicationConnection</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-reference-error-sqlstates">5.8. Mapping
									MySQL Error Numbers to JDBC SQLState Codes</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-basic">6. JDBC Concepts</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-connect-drivermanager">6.1.
									Connecting to MySQL Using the JDBC <code class="literal">DriverManager</code>
									Interface
							</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-statements">6.2. Using JDBC <code
										class="literal">Statement</code> Objects to Execute SQL
							</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-statements-callable">6.3.
									Using JDBC <code class="literal">CallableStatements</code> to
									Execute Stored Procedures
							</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-last-insert-id">6.4.
									Retrieving <code class="literal">AUTO_INCREMENT</code> Column
									Values through JDBC
							</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-j2ee-concepts-connection-pooling">7.
							Connection Pooling with Connector/J</a></span>
				</dt>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections">8.
							Load Balancing with Connector/J</a></span>
				</dt>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-j2ee-concepts-load-balancing-failover">9.
							Failover with Connector/J</a></span>
				</dt>
				<dt>
					<span class="chapter"><a href="#connector-j-interceptors">10.
							Using the Connector/J Interceptor Classes</a></span>
				</dt>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-tomcat">11. Using Connector/J
							with Tomcat</a></span>
				</dt>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-jboss">12. Using Connector/J
							with JBoss</a></span>
				</dt>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-spring-config">13. Using
							Connector/J with Spring</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-spring-config-jdbctemplate">13.1.
									Using <code class="classname">JdbcTemplate</code>
							</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-spring-config-transactional">13.2.
									Transactional JDBC Access</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-spring-config-connpooling">13.3.
									Connection Pooling with Spring</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-glassfish-config">14. Using
							Connector/J with GlassFish</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-glassfish-config-jsp">14.1. A
									Simple JSP Application with Glassfish, Connector/J and MySQL</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-usagenotes-glassfish-config-servlet">14.2.
									A Simple Servlet with Glassfish, Connector/J and MySQL</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="chapter"><a
						href="#connector-j-usagenotes-troubleshooting">15.
							Troubleshooting Connector/J Applications</a></span>
				</dt>
				<dt>
					<span class="chapter"><a href="#connector-j-support">16.
							Connector/J Support</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-support-community">16.1. Connector/J
									Community Support</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-support-bug-report">16.2. How to Report
									Connector/J Bugs or Problems</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-support-changelog">16.3. Connector/J
									Change History</a></span>
						</dt>
					</dl>
				</dd>
				<dt>
					<span class="appendix"><a href="#cj-news">A. MySQL
							Connector/J Change History</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-5-1-x">A.1.
									Changes in MySQL Connector/J 5.1.x</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-5-1-22">A.1.1.
											Changes in MySQL Connector/J 5.1.22 (Not yet released)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-21">A.1.2.
											Changes in MySQL Connector/J 5.1.21 (2012-07-03)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-20">A.1.3.
											Changes in MySQL Connector/J 5.1.20 (2012-05-01)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-19">A.1.4.
											Changes in MySQL Connector/J 5.1.19 (April 2012)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-18">A.1.5.
											Changes in MySQL Connector/J 5.1.18 (2011-10-04)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-17">A.1.6.
											Changes in MySQL Connector/J 5.1.17 (2011-07-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-16">A.1.7.
											Changes in MySQL Connector/J 5.1.16 (Not released)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-15">A.1.8.
											Changes in MySQL Connector/J 5.1.15 (2011-02-09)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-14">A.1.9.
											Changes in MySQL Connector/J 5.1.14 (6th December 2010)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-13">A.1.10.
											Changes in MySQL Connector/J 5.1.13 (2010-06-24)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-12">A.1.11.
											Changes in MySQL Connector/J 5.1.12 (2010-02-18)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-11">A.1.12.
											Changes in MySQL Connector/J 5.1.11 (2010-01-21)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-10">A.1.13.
											Changes in MySQL Connector/J 5.1.10 (2009-09-23)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-9">A.1.14.
											Changes in MySQL Connector/J 5.1.9 (2009-09-21)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-8">A.1.15.
											Changes in MySQL Connector/J 5.1.8 (2009-07-16)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-7">A.1.16.
											Changes in MySQL Connector/J 5.1.7 (2008-10-21)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-6">A.1.17.
											Changes in MySQL Connector/J 5.1.6 (2008-03-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-5">A.1.18.
											Changes in MySQL Connector/J 5.1.5 (2007-10-09)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-4">A.1.19.
											Changes in MySQL Connector/J 5.1.4 (Not Released)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-3">A.1.20.
											Changes in MySQL Connector/J 5.1.3 (2007-09-10)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-2">A.1.21.
											Changes in MySQL Connector/J 5.1.2 (2007-06-29)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-1">A.1.22.
											Changes in MySQL Connector/J 5.1.1 (2007-06-22)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-1-0">A.1.23.
											Changes in MySQL Connector/J 5.1.0 (2007-04-11)</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a href="#cj-news-5-0-x">A.2.
									Changes in MySQL Connector/J 5.0.x</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-5-0-8">A.2.1.
											Changes in MySQL Connector/J 5.0.8 (2007-10-09)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-7">A.2.2.
											Changes in MySQL Connector/J 5.0.7 (2007-07-20)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-6">A.2.3.
											Changes in MySQL Connector/J 5.0.6 (2007-05-15)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-5">A.2.4.
											Changes in MySQL Connector/J 5.0.5 (2007-03-02)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-4">A.2.5.
											Changes in MySQL Connector/J 5.0.4 (2006-10-20)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-3">A.2.6.
											Changes in MySQL Connector/J 5.0.3 (2006-07-26, beta)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-2">A.2.7.
											Changes in MySQL Connector/J 5.0.2 (2006-07-11)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-1">A.2.8.
											Changes in MySQL Connector/J 5.0.1 (Not Released)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-5-0-0">A.2.9.
											Changes in MySQL Connector/J 5.0.0 (2005-12-22)</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a href="#cj-news-3-1-x">A.3.
									Changes in MySQL Connector/J 3.1.x</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-3-1-15">A.3.1.
											Changes in MySQL Connector/J 3.1.15 (Not yet released)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-14">A.3.2.
											Changes in MySQL Connector/J 3.1.14 (2006-10-19)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-13">A.3.3.
											Changes in MySQL Connector/J 3.1.13 (2006-05-26)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-12">A.3.4.
											Changes in MySQL Connector/J 3.1.12 (2005-11-30)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-11">A.3.5.
											Changes in MySQL Connector/J 3.1.11 (2005-10-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-10">A.3.6.
											Changes in MySQL Connector/J 3.1.10 (2005-06-23)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-9">A.3.7.
											Changes in MySQL Connector/J 3.1.9 (2005-06-22)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-8">A.3.8.
											Changes in MySQL Connector/J 3.1.8 (2005-04-14)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-7">A.3.9.
											Changes in MySQL Connector/J 3.1.7 (2005-02-18)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-6">A.3.10.
											Changes in MySQL Connector/J 3.1.6 (2004-12-23)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-5">A.3.11.
											Changes in MySQL Connector/J 3.1.5 (2004-12-02)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-4">A.3.12.
											Changes in MySQL Connector/J 3.1.4 (2004-09-04)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-3">A.3.13.
											Changes in MySQL Connector/J 3.1.3 (2004-07-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-2">A.3.14.
											Changes in MySQL Connector/J 3.1.2 (2004-06-09)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-1">A.3.15.
											Changes in MySQL Connector/J 3.1.1 (2004-02-14, alpha)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-1-0">A.3.16.
											Changes in MySQL Connector/J 3.1.0 (2003-02-18, alpha)</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a href="#cj-news-3-0-x">A.4.
									Changes in MySQL Connector/J 3.0.x</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-3-0-17">A.4.1.
											Changes in MySQL Connector/J 3.0.17 (2005-06-23)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-16">A.4.2.
											Changes in MySQL Connector/J 3.0.16 (2004-11-15)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-15">A.4.3.
											Changes in MySQL Connector/J 3.0.15 (2004-09-04)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-14">A.4.4.
											Changes in MySQL Connector/J 3.0.14 (2004-05-28)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-13">A.4.5.
											Changes in MySQL Connector/J 3.0.13 (2004-05-27)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-12">A.4.6.
											Changes in MySQL Connector/J 3.0.12 (2004-05-18)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-11">A.4.7.
											Changes in MySQL Connector/J 3.0.11 (2004-02-19)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-10">A.4.8.
											Changes in MySQL Connector/J 3.0.10 (2004-01-13)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-9">A.4.9.
											Changes in MySQL Connector/J 3.0.9 (2003-10-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-8">A.4.10.
											Changes in MySQL Connector/J 3.0.8 (2003-05-23)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-7">A.4.11.
											Changes in MySQL Connector/J 3.0.7 (2003-04-08)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-6">A.4.12.
											Changes in MySQL Connector/J 3.0.6 (2003-02-18)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-5">A.4.13.
											Changes in MySQL Connector/J 3.0.5 (2003-01-22)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-4">A.4.14.
											Changes in MySQL Connector/J 3.0.4 (2003-01-06)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-3">A.4.15.
											Changes in MySQL Connector/J 3.0.3 (2002-12-17)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-2">A.4.16.
											Changes in MySQL Connector/J 3.0.2 (2002-11-08)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-1">A.4.17.
											Changes in MySQL Connector/J 3.0.1 (2002-09-21)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-3-0-0">A.4.18.
											Changes in MySQL Connector/J 3.0.0 (2002-07-31)</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a href="#cj-news-2-0-x">A.5.
									Changes in MySQL Connector/J 2.0.x</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-2-0-14">A.5.1.
											Changes in MySQL Connector/J 2.0.14 (2002-05-16)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-13">A.5.2.
											Changes in MySQL Connector/J 2.0.13 (2002-04-24)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-12">A.5.3.
											Changes in MySQL Connector/J 2.0.12 (2002-04-07)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-11">A.5.4.
											Changes in MySQL Connector/J 2.0.11 (2002-01-27)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-10">A.5.5.
											Changes in MySQL Connector/J 2.0.10 (2002-01-24)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-9">A.5.6.
											Changes in MySQL Connector/J 2.0.9 (2002-01-13)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-8">A.5.7.
											Changes in MySQL Connector/J 2.0.8 (2001-11-25)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-7">A.5.8.
											Changes in MySQL Connector/J 2.0.7 (2001-10-24)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-6">A.5.9.
											Changes in MySQL Connector/J 2.0.6 (2001-06-16)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-5">A.5.10.
											Changes in MySQL Connector/J 2.0.5 (2001-06-13)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-3">A.5.11.
											Changes in MySQL Connector/J 2.0.3 (2000-12-03)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0-1">A.5.12.
											Changes in MySQL Connector/J 2.0.1 (2000-04-06)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0pre5">A.5.13.
											Changes in MySQL Connector/J 2.0.0pre5 (21 February 2000)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0pre4">A.5.14.
											Changes in MySQL Connector/J 2.0.0pre4 (10 January 2000)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-2-0pre">A.5.15.
											Changes in MySQL Connector/J 2.0.0pre (17 August 1999)</a></span>
								</dt>
							</dl>
						</dd>
						<dt>
							<span class="section"><a href="#cj-news-1-2-x">A.6.
									Changes in MySQL Connector/J 1.2.x and lower</a></span>
						</dt>
						<dd>
							<dl>
								<dt>
									<span class="section"><a href="#cj-news-1-2b">A.6.1.
											Changes in MySQL Connector/J 1.2b (04 July 1999)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-2a">A.6.2.
											Changes in MySQL Connector/J 1.2a (14 April 1999)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1i">A.6.3.
											Changes in MySQL Connector/J 1.1i (24 March 1999)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1h">A.6.4.
											Changes in MySQL Connector/J 1.1h (08 March 1999)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1g">A.6.5.
											Changes in MySQL Connector/J 1.1g (19 February 1999)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1f">A.6.6.
											Changes in MySQL Connector/J 1.1f (31 December 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1b">A.6.7.
											Changes in MySQL Connector/J 1.1b (03 November 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-1">A.6.8.
											Changes in MySQL Connector/J 1.1 (02 September 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-1-0">A.6.9.
											Changes in MySQL Connector/J 1.0 (24 August 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-0-9d">A.6.10.
											Changes in MySQL Connector/J 0.9d (04 August 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-0-9">A.6.11.
											Changes in MySQL Connector/J 0.9 (28 July 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-0-8">A.6.12.
											Changes in MySQL Connector/J 0.8 (06 July 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-0-7">A.6.13.
											Changes in MySQL Connector/J 0.7 (01 July 1998)</a></span>
								</dt>
								<dt>
									<span class="section"><a href="#cj-news-0-6">A.6.14.
											Changes in MySQL Connector/J 0.6 (21 May 1998)</a></span>
								</dt>
							</dl>
						</dd>
					</dl>
				</dd>
				<dt>
					<span class="appendix"><a
						href="#connector-j-third-party-licenses">B. Licenses for
							Third-Party Components</a></span>
				</dt>
				<dd>
					<dl>
						<dt>
							<span class="section"><a href="#license-ant-contrib">B.1.
									Ant-Contrib License</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#license-slf4j">B.2.
									Simple Logging Facade for Java (SLF4J) License</a></span>
						</dt>
					</dl>
				</dd>
			</dl>
		</div>
		<div class="preface">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="preface"></a>Preface and Legal Notices
						</h1>
					</div>
				</div>
			</div>
			<p>This manual describes MySQL Connector/J, the JDBC
				implementation for communicating with MySQL servers.</p>
			<h2>
				<a name="legalnotice"></a>Legal Notices
			</h2>
			<p>Copyright © 1997, 2012, Oracle and/or its affiliates. All
				rights reserved.</p>
			<p>This software and related documentation are provided under a
				license agreement containing restrictions on use and disclosure and
				are protected by intellectual property laws. Except as expressly
				permitted in your license agreement or allowed by law, you may not
				use, copy, reproduce, translate, broadcast, modify, license,
				transmit, distribute, exhibit, perform, publish, or display any
				part, in any form, or by any means. Reverse engineering,
				disassembly, or decompilation of this software, unless required by
				law for interoperability, is prohibited.</p>
			<p>The information contained herein is subject to change without
				notice and is not warranted to be error-free. If you find any
				errors, please report them to us in writing.</p>
			<p>If this software or related documentation is delivered to the
				U.S. Government or anyone licensing it on behalf of the U.S.
				Government, the following notice is applicable:</p>
			<p>U.S. GOVERNMENT RIGHTS Programs, software, databases, and
				related documentation and technical data delivered to U.S.
				Government customers are "commercial computer software" or
				"commercial technical data" pursuant to the applicable Federal
				Acquisition Regulation and agency-specific supplemental regulations.
				As such, the use, duplication, disclosure, modification, and
				adaptation shall be subject to the restrictions and license terms
				set forth in the applicable Government contract, and, to the extent
				applicable by the terms of the Government contract, the additional
				rights set forth in FAR 52.227-19, Commercial Computer Software
				License (December 2007). Oracle USA, Inc., 500 Oracle Parkway,
				Redwood City, CA 94065.</p>
			<p>This software is developed for general use in a variety of
				information management applications. It is not developed or intended
				for use in any inherently dangerous applications, including
				applications which may create a risk of personal injury. If you use
				this software in dangerous applications, then you shall be
				responsible to take all appropriate fail-safe, backup, redundancy,
				and other measures to ensure the safe use of this software. Oracle
				Corporation and its affiliates disclaim any liability for any
				damages caused by use of this software in dangerous applications.</p>
			<p>Oracle is a registered trademark of Oracle Corporation and/or
				its affiliates. MySQL is a trademark of Oracle Corporation and/or
				its affiliates, and shall not be used without Oracle's express
				written authorization. Other names may be trademarks of their
				respective owners.</p>
			<p>This software and documentation may provide access to or
				information on content, products, and services from third parties.
				Oracle Corporation and its affiliates are not responsible for and
				expressly disclaim all warranties of any kind with respect to
				third-party content, products, and services. Oracle Corporation and
				its affiliates will not be responsible for any loss, costs, or
				damages incurred due to your access to or use of third-party
				content, products, or services.</p>
			<p>This document in any form, software or printed matter,
				contains proprietary information that is the exclusive property of
				Oracle. Your access to and use of this material is subject to the
				terms and conditions of your Oracle Software License and Service
				Agreement, which has been executed and with which you agree to
				comply. This document and information contained herein may not be
				disclosed, copied, reproduced, or distributed to anyone outside
				Oracle without prior written consent of Oracle or as specifically
				provided below. This document is not part of your license agreement
				nor can it be incorporated into any contractual agreement with
				Oracle or its subsidiaries or affiliates.</p>
			<p>This documentation is NOT distributed under a GPL license. Use
				of this documentation is subject to the following terms:</p>
			<p>You may create a printed copy of this documentation solely for
				your own personal use. Conversion to other formats is allowed as
				long as the actual content is not altered or edited in any way. You
				shall not publish or distribute this documentation in any form or on
				any media, except if you distribute the documentation in a manner
				similar to how Oracle disseminates it (that is, electronically for
				download on a Web site with the software) or on a CD-ROM or similar
				medium, provided however that the documentation is disseminated
				together with the software on the same medium. Any other use, such
				as any dissemination of printed copies or use of this documentation,
				in whole or in part, in another publication, requires the prior
				written consent from an authorized representative of Oracle. Oracle
				and/or its affiliates reserve any and all rights to this
				documentation not expressly granted above.</p>
			<p>
				For more information on the terms of this license, or for details on
				how the MySQL documentation is built and produced, please visit <a
					class="ulink" href="http://dev.mysql.com/contact/" target="_top">MySQL
					Contact &amp; Questions</a>.
			</p>
			<p>
				For additional licensing information, including licenses for
				third-party libraries used by MySQL products, see <a class="xref"
					href="#preface" title="Preface and Legal Notices">Preface and
					Legal Notices</a>.
			</p>
			<p>
				For help with using MySQL, please visit either the <a class="ulink"
					href="http://forums.mysql.com" target="_top">MySQL Forums</a> or <a
					class="ulink" href="http://lists.mysql.com" target="_top">MySQL
					Mailing Lists</a> where you can discuss your issues with other MySQL
				users.
			</p>
			<p>
				For additional documentation on MySQL products, including
				translations of the documentation into other languages, and
				downloadable versions in variety of formats, including HTML and PDF
				formats, see the <a class="ulink" href="http://dev.mysql.com/doc"
					target="_top">MySQL Documentation Library</a>.
			</p>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j"></a>Chapter 1. MySQL Connector/J
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id551083"></a>
			<p>This section explains how to configure and develop Java
				applications with MySQL Connector/J, the JDBC driver that is
				integrated with MySQL.</p>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-versions"></a>Chapter 2. Connector/J
							Versions
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a href="#connector-j-versions-java">2.1.
								Java Versions Supported</a></span>
					</dt>
				</dl>
			</div>
			<a class="indexterm" name="id551122"></a>
			<p>There are currently four versions of MySQL Connector/J
				available:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							Connector/J 5.1 is the Type 4 pure Java JDBC driver, which
							conforms to the JDBC 3.0 and JDBC 4.0 specifications. It provides
							compatibility with all the functionality of MySQL, including 4.1,
							5.0, 5.1, 5.4 and 5.5. Connector/J 5.1 provides ease of
							development features, including auto-registration with the Driver
							Manager, standardized validity checks, categorized SQLExceptions,
							support for the JDBC-4.0 XML processing, per connection client
							information, <a class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
								target="_top"><code class="literal">NCHAR</code></a>, <a
								class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
								target="_top"><code class="literal">NVARCHAR</code></a> and
							<code class="literal">NCLOB</code>
							types. This release also includes all bug fixes up to and
							including Connector/J 5.0.6.
						</p></li>
					<li class="listitem"><p>Connector/J 5.0 provides support
							for all the functionality offered by Connector/J 3.1 and includes
							distributed transaction (XA) support.</p></li>
					<li class="listitem"><p>Connector/J 3.1 was designed for
							connectivity to MySQL 4.1 and MySQL 5.0 servers and provides
							support for all the functionality in MySQL 5.0 except distributed
							transaction (XA) support.</p></li>
					<li class="listitem"><p>Connector/J 3.0 provides core
							functionality and was designed for connectivity to MySQL 3.x or
							MySQL 4.1 servers, although it provides basic compatibility with
							later versions of MySQL. Connector/J 3.0 does not support
							server-side prepared statements, and does not support any of the
							features in versions of MySQL later than 4.1.</p></li>
				</ul>
			</div>
			<p>The following table summarizes the Connector/J versions
				available:</p>
			<p></p>
			<div class="informaltable">
				<table border="1">
					<colgroup>
						<col>
						<col>
						<col>
						<col>
						<col>
					</colgroup>
					<thead>
						<tr>
							<th scope="col">Connector/J version</th>
							<th scope="col">Driver Type</th>
							<th scope="col">JDBC version</th>
							<th scope="col">MySQL Server version</th>
							<th scope="col">Status</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td scope="row">5.1</td>
							<td>4</td>
							<td>3.0, 4.0</td>
							<td>4.1, 5.0, 5.1, 5.4, 5.5</td>
							<td>Recommended version</td>
						</tr>
						<tr>
							<td scope="row">5.0</td>
							<td>4</td>
							<td>3.0</td>
							<td>4.1, 5.0</td>
							<td>Released version</td>
						</tr>
						<tr>
							<td scope="row">3.1</td>
							<td>4</td>
							<td>3.0</td>
							<td>4.1, 5.0</td>
							<td>Obsolete</td>
						</tr>
						<tr>
							<td scope="row">3.0</td>
							<td>4</td>
							<td>3.0</td>
							<td>3.x, 4.1</td>
							<td>Obsolete</td>
						</tr>
					</tbody>
				</table>
			</div>
			<p></p>
			<p>The current recommended version for Connector/J is 5.1. This
				guide covers all four connector versions, with specific notes given
				where a setting applies to a specific option.</p>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-versions-java"></a>2.1. Java Versions
								Supported
							</h2>
						</div>
					</div>
				</div>
				<p>The following table summarizes Connector/J Java dependencies:
				</p>
				<p></p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th scope="col">Connector/J version</th>
								<th scope="col">Java RTE required</th>
								<th scope="col">JDK required (to build source code)</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td scope="row">5.1</td>
								<td>1.5.x, 1.6.x</td>
								<td>1.6.x and 1.5.x</td>
							</tr>
							<tr>
								<td scope="row">5.0</td>
								<td>1.3.x, 1.4.x, 1.5.x, 1.6.x</td>
								<td>1.4.2, 1.5.x, 1.6.x</td>
							</tr>
							<tr>
								<td scope="row">3.1</td>
								<td>1.2.x, 1.3.x, 1.4.x, 1.5.x, 1.6.x</td>
								<td>1.4.2, 1.5.x, 1.6.x</td>
							</tr>
							<tr>
								<td scope="row">3.0</td>
								<td>1.2.x, 1.3.x, 1.4.x, 1.5.x, 1.6.x</td>
								<td>1.4.2, 1.5.x, 1.6.x</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					If you are building Connector/J from source code using the source
					distribution (see <a class="xref"
						href="#connector-j-installing-source"
						title="3.4. Installing from the Development Source Tree">Section 3.4,
						“Installing from the Development Source Tree”</a>), you must use JDK
					1.4.2 or newer to compile the Connector package. For Connector/J
					5.1, you must have both JDK-1.6.x and JDK-1.5.x installed to be
					able to build the source code.
				</p>
				<p>
					Because of the implementation of
					<code class="classname">java.sql.Savepoint</code>
					, Connector/J 3.1.0 and newer will not run on a Java runtime older
					than 1.4 unless the class verifier is turned off (by setting the
					<code class="option">-Xverify:none</code>
					option to the Java runtime). This is because the class verifier
					will try to load the class definition for
					<code class="classname">java.sql.Savepoint</code>
					even though it is not accessed by the driver unless you actually
					use savepoint functionality.
				</p>
				<p>
					Caching functionality provided by Connector/J 3.1.0 or newer is
					also not available on JVMs older than 1.4.x, as it relies on
					<code class="classname">java.util.LinkedHashMap</code>
					which was first available in JDK-1.4.0.
				</p>
				<p>MySQL Connector/J does not support JDK-1.1.x or JDK-1.0.x.</p>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-installing"></a>Chapter 3. Connector/J
							Installation
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-binary-installation">3.1. Installing
								Connector/J from a Binary Distribution</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-installing-classpath">3.2. Installing the
								Driver and Configuring the <code class="literal">CLASSPATH</code>
						</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-installing-upgrading">3.3. Upgrading from
								an Older Version</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a
									href="#connector-j-installing-upgrading-5-1">3.3.1.
										Upgrading to MySQL Connector/J 5.1.x</a></span>
							</dt>
							<dt>
								<span class="section"><a
									href="#connector-j-installing-upgrading-issues">3.3.2.
										JDBC-Specific Issues When Upgrading to MySQL Server 4.1 or
										Newer</a></span>
							</dt>
							<dt>
								<span class="section"><a
									href="#connector-j-installing-upgrading-3-0-to-3-1">3.3.3.
										Upgrading from MySQL Connector/J 3.0 to 3.1</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a
							href="#connector-j-installing-source">3.4. Installing from
								the Development Source Tree</a></span>
					</dt>
				</dl>
			</div>
			<p>
				You can install the Connector/J package using either the binary or
				source distribution. The binary distribution provides the easiest
				method for installation; the source distribution lets you customize
				your installation further. With either solution, you manually add
				the Connector/J location to your Java
				<code class="literal">CLASSPATH</code>
				.
			</p>
			<p>
				If you are upgrading from a previous version, read the upgrade
				information in <a class="xref"
					href="#connector-j-installing-upgrading"
					title="3.3. Upgrading from an Older Version">Section 3.3,
					“Upgrading from an Older Version”</a> before continuing.
			</p>
			<p>
				Connector/J is also available as part of the Maven project. For more
				information, and to download the Connector/J JAR files, see the <a
					class="ulink" href="http://www.ibiblio.org/maven/" target="_top">Maven
					repository</a>.
			</p>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-binary-installation"></a>3.1. Installing
								Connector/J from a Binary Distribution
							</h2>
						</div>
					</div>
				</div>
				<p>
					For the easiest method of installation, use the binary distribution
					of the Connector/J package. The binary distribution is available
					either as a tar/gzip or zip file. Extract it to a suitable
					location, then optionally make the information about the package
					available by changing your
					<code class="literal">CLASSPATH</code>
					(see <a class="xref" href="#connector-j-installing-classpath"
						title="3.2. Installing the Driver and Configuring the CLASSPATH">Section 3.2,
						“Installing the Driver and Configuring the <code class="literal">CLASSPATH</code>”
					</a>).
				</p>
				<p>
					MySQL Connector/J is distributed as a
					<code class="literal">.zip</code>
					or
					<code class="literal">.tar.gz</code>
					archive containing the sources, the class files, and the JAR
					archive named
					<code class="filename">
						mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin.jar
					</code>
					.
				</p>
				<p>
					Starting with Connector/J 3.1.9, the
					<code class="filename">.class</code>
					files that constitute the JAR files are only included as part of
					the driver JAR file.
				</p>
				<p>
					Starting with Connector/J 3.1.8, the archive also includes a debug
					build of the driver in a file named
					<code class="filename">
						mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin-g.jar
					</code>
					. Do not use the debug build of the driver unless instructed to do
					so when reporting a problem or a bug, as it is not designed to be
					run in production environments, and will have adverse performance
					impact when used. The debug binary also depends on the Aspect/J
					runtime library, which is located in the
					<code class="filename">src/lib/aspectjrt.jar</code>
					file that comes with the Connector/J distribution.
				</p>
				<p>
					Use the appropriate graphical or command-line utility to extract
					the distribution (for example, WinZip for the .zip archive, and <span
						class="command"><strong>tar</strong></span> for the .tar.gz
					archive). Because there are potentially long file names in the
					distribution, we use the GNU tar archive format. Use GNU tar (or an
					application that understands the GNU tar archive format) to unpack
					the .tar.gz variant of the distribution.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-installing-classpath"></a>3.2. Installing
								the Driver and Configuring the
								<code class="literal">CLASSPATH</code>
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id551831"></a>
				<p>
					Once you have extracted the distribution archive, you can install
					the driver by placing
					<code class="filename">
						mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin.jar
					</code>
					in your classpath, either by adding the full path to it to your
					<code class="literal">CLASSPATH</code>
					environment variable, or by directly specifying it with the command
					line switch
					<code class="literal">-cp</code>
					when starting the JVM.
				</p>
				<p>
					To use the driver with the JDBC
					<code class="literal">DriverManager</code>
					, use
					<code class="literal">com.mysql.jdbc.Driver</code>
					as the class that implements
					<code class="classname">java.sql.Driver</code>
					.
				</p>
				<p>
					You can set the
					<code class="literal">CLASSPATH</code>
					environment variable under UNIX, Linux or Mac OS X either locally
					for a user within their
					<code class="literal">.profile</code>
					,
					<code class="literal">.login</code>
					or other login file. You can also set it globally by editing the
					global
					<code class="literal">/etc/profile</code>
					file.
				</p>
				<p>
					For example, add the Connector/J driver to your
					<code class="literal">CLASSPATH</code>
					using one of the following forms, depending on your command shell:
				</p>
				<pre class="programlisting"># Bourne-compatible shell (sh, ksh, bash, zsh):
shell&gt; export CLASSPATH=/path/mysql-connector-java-<em
						class="replaceable"><code>ver</code></em>-bin.jar:$CLASSPATH
# C shell (csh, tcsh):
shell&gt; setenv CLASSPATH /path/mysql-connector-java-<em
						class="replaceable"><code>ver</code></em>-bin.jar:$CLASSPATH
</pre>
				<p>Within Windows 2000, Windows XP, Windows Server 2003 and
					Windows Vista, you set the environment variable through the System
					Control Panel.</p>
				<p>
					To use MySQL Connector/J with an application server such as
					GlassFish, Tomcat or JBoss, read your vendor's documentation for
					more information on how to configure third-party class libraries,
					as most application servers ignore the
					<code class="literal">CLASSPATH</code>
					environment variable. For configuration examples for some J2EE
					application servers, see <a class="xref"
						href="#connector-j-usagenotes-j2ee-concepts-connection-pooling"
						title="Chapter 7. Connection Pooling with Connector/J">Chapter 7,
						<i>Connection Pooling with Connector/J</i>
					</a> <a class="xref"
						href="#connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections"
						title="Chapter 8. Load Balancing with Connector/J">Chapter 8,
						<i>Load Balancing with Connector/J</i>
					</a>, and <a class="xref"
						href="#connector-j-usagenotes-j2ee-concepts-load-balancing-failover"
						title="Chapter 9. Failover with Connector/J">Chapter 9, <i>Failover
							with Connector/J</i></a>. However, the authoritative source for JDBC
					connection pool configuration information for your particular
					application server is the documentation for that application
					server.
				</p>
				<p>
					If you are developing servlets or JSPs, and your application server
					is J2EE-compliant, you can put the driver's
					<code class="literal">.jar</code>
					file in the
					<code class="filename">WEB-INF/lib</code>
					subdirectory of your webapp, as this is a standard location for
					third party class libraries in J2EE web applications.
				</p>
				<p>
					You can also use the
					<code class="classname">MysqlDataSource</code>
					or
					<code class="classname">MysqlConnectionPoolDataSource</code>
					classes in the
					<code class="literal">com.mysql.jdbc.jdbc2.optional</code>
					package, if your J2EE application server supports or requires them.
					Starting with Connector/J 5.0.0, the
					<code class="literal">javax.sql.XADataSource</code>
					interface is implemented using the
					<code class="literal">com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</code>
					class, which supports XA distributed transactions when used in
					combination with MySQL server version 5.0.
				</p>
				<p>
					The various
					<code class="classname">MysqlDataSource</code>
					classes support the following parameters (through standard set
					mutators):
				</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								<code class="literal">user</code>
							</p></li>
						<li class="listitem"><p>
								<code class="literal">password</code>
							</p></li>
						<li class="listitem"><p>
								<code class="literal">serverName</code>
								(see the previous section about fail-over hosts)
							</p></li>
						<li class="listitem"><p>
								<code class="literal">databaseName</code>
							</p></li>
						<li class="listitem"><p>
								<code class="literal">port</code>
							</p></li>
					</ul>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-installing-upgrading"></a>3.3. Upgrading
								from an Older Version
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-upgrading-5-1">3.3.1.
									Upgrading to MySQL Connector/J 5.1.x</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-upgrading-issues">3.3.2.
									JDBC-Specific Issues When Upgrading to MySQL Server 4.1 or
									Newer</a></span>
						</dt>
						<dt>
							<span class="section"><a
								href="#connector-j-installing-upgrading-3-0-to-3-1">3.3.3.
									Upgrading from MySQL Connector/J 3.0 to 3.1</a></span>
						</dt>
					</dl>
				</div>
				<p>This section has information for users who are upgrading from
					one version of Connector/J to another, or to a new version of the
					MySQL server that supports a more recent level of JDBC. A newer
					version of Connector/J might include changes to support new
					features, improve existing functionality, or comply with new
					standards.</p>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="connector-j-installing-upgrading-5-1"></a>3.3.1. Upgrading
									to MySQL Connector/J 5.1.x
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									In Connector/J 5.0.x and earlier, the alias for a table in a <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a>
									statement is returned when accessing the result set metadata
									using
									<code class="function">ResultSetMetaData.getColumnName()</code>
									. This behavior however is not JDBC compliant, and in
									Connector/J 5.1 this behavior was changed so that the original
									table name, rather than the alias, is returned.
								</p>
								<p>
									The JDBC-compliant behavior is designed to let API users
									reconstruct the DML statement based on the metadata within
									<code class="literal">ResultSet</code>
									and
									<code class="literal">ResultSetMetaData</code>
									.
								</p>
								<p>
									You can get the alias for a column in a result set by calling
									<code class="function">ResultSetMetaData.getColumnLabel()</code>
									. To use the old noncompliant behavior with
									<code class="function">ResultSetMetaData.getColumnName()</code>
									, use the
									<code class="option">useOldAliasMetadataBehavior</code>
									option and set the value to
									<code class="literal">true</code>
									.
								</p>
								<p>
									In Connector/J 5.0.x, the default value of
									<code class="option">useOldAliasMetadataBehavior</code>
									was
									<code class="literal">true</code>
									, but in Connector/J 5.1 this was changed to a default value of
									<code class="literal">false</code>
									.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="connector-j-installing-upgrading-issues"></a>3.3.2. JDBC-Specific
									Issues When Upgrading to MySQL Server 4.1 or Newer
								</h3>
							</div>
						</div>
					</div>
					<a class="indexterm" name="id552196"></a><a class="indexterm"
						name="id552207"></a>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="emphasis"><em>Using the UTF-8
											Character Encoding</em></span> - Prior to MySQL server version 4.1, the
									UTF-8 character encoding was not supported by the server,
									however the JDBC driver could use it, allowing storage of
									multiple character sets in
									<code class="literal">latin1</code>
									tables on the server.
								</p>
								<p>Starting with MySQL-4.1, this functionality is
									deprecated. If you have applications that rely on this
									functionality, and can not upgrade them to use the official
									Unicode character support in MySQL server version 4.1 or newer,
									add the following property to your connection URL:</p>
								<p>
									<code class="computeroutput">useOldUTF8Behavior=true</code>
								</p></li>
							<li class="listitem"><p>
									<span class="emphasis"><em>Server-side Prepared
											Statements</em></span> - Connector/J 3.1 will automatically detect and
									use server-side prepared statements when they are available
									(MySQL server version 4.1.0 and newer). If your application
									encounters issues with server-side prepared statements, you can
									revert to the older client-side emulated prepared statement
									code that is still presently used for MySQL servers older than
									4.1.0 with the following connection property:
								</p>
								<p>
									<code class="computeroutput">useServerPrepStmts=false</code>
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="connector-j-installing-upgrading-3-0-to-3-1"></a>3.3.3. Upgrading
									from MySQL Connector/J 3.0 to 3.1
								</h3>
							</div>
						</div>
					</div>
					<p>
						Connector/J 3.1 is designed to be backward-compatible with
						Connector/J 3.0 as much as possible. Major changes are isolated to
						new functionality exposed in MySQL-4.1 and newer, which includes
						Unicode character sets, server-side prepared statements,
						<code class="literal">SQLState</code>
						codes returned in error messages by the server and various
						performance enhancements that can be enabled or disabled using
						configuration properties.
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="bold"><strong>Unicode Character
											Sets</strong></span>: See the next section, as well as <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/charset.html"
										target="_top">Character Set Support</a>, for information on
									this MySQL feature. If you have something misconfigured, it
									will usually show up as an error with a message similar to
									<code class="literal">Illegal mix of collations</code>
									.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>Server-side Prepared
											Statements</strong></span>: Connector/J 3.1 will automatically detect and use
									server-side prepared statements when they are available (MySQL
									server version 4.1.0 and newer).
								</p>
								<p>
									Starting with version 3.1.7, the driver scans SQL you are
									preparing using all variants of
									<code class="literal">Connection.prepareStatement()</code>
									to determine if it is a supported type of statement to prepare
									on the server side, and if it is not supported by the server,
									it instead prepares it as a client-side emulated prepared
									statement. You can disable this feature by passing
									<code class="literal">emulateUnsupportedPstmts=false</code>
									in your JDBC URL.
								</p>
								<p>
									If your application encounters issues with server-side prepared
									statements, you can revert to the older client-side emulated
									prepared statement code that is still presently used for MySQL
									servers older than 4.1.0 with the connection property
									<code class="literal">useServerPrepStmts=false</code>
									.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>Datetimes</strong></span> with
									all-zero components (
									<code class="literal">0000-00-00 ...</code>
									): These values cannot be represented reliably in Java.
									Connector/J 3.0.x always converted them to
									<code class="literal">NULL</code>
									when being read from a ResultSet.
								</p>
								<p>
									Connector/J 3.1 throws an exception by default when these
									values are encountered, as this is the most correct behavior
									according to the JDBC and SQL standards. This behavior can be
									modified using the
									<code class="literal">zeroDateTimeBehavior</code>
									configuration property. The permissible values are:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">exception</code>
												(the default), which throws an SQLException with an SQLState
												of
												<code class="literal">S1009</code>
												.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">convertToNull</code>
												, which returns
												<code class="literal">NULL</code>
												instead of the date.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">round</code>
												, which rounds the date to the nearest closest value which
												is
												<code class="literal">0001-01-01</code>
												.
											</p></li>
									</ul>
								</div>
								<p>
									Starting with Connector/J 3.1.7,
									<code class="literal">ResultSet.getString()</code>
									can be decoupled from this behavior using
									<code class="literal">noDatetimeStringSync=true</code>
									(the default value is
									<code class="literal">false</code>
									) so that you can retrieve the unaltered all-zero value as a
									String. Note that this also precludes using any time zone
									conversions, therefore the driver will not allow you to enable
									<code class="literal">noDatetimeStringSync</code>
									and
									<code class="literal">useTimezone</code>
									at the same time.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>New SQLState Codes</strong></span>:
									Connector/J 3.1 uses SQL:1999 SQLState codes returned by the
									MySQL server (if supported), which are different from the
									legacy X/Open state codes that Connector/J 3.0 uses. If
									connected to a MySQL server older than MySQL-4.1.0 (the oldest
									version to return SQLStates as part of the error code), the
									driver will use a built-in mapping. You can revert to the old
									mapping by using the configuration property
									<code class="literal">useSqlStateCodes=false</code>
									.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong><code
												class="literal">ResultSet.getString()</code></strong></span>: Calling
									<code class="literal">ResultSet.getString()</code>
									on a <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> column
									will now return the address of the
									<code class="literal">byte[]</code>
									array that represents it, instead of a
									<code class="literal">String</code>
									representation of the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>. <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> values
									have no character set, so they cannot be converted to
									<code class="literal">java.lang.String</code>
									s without data loss or corruption.
								</p>
								<p>
									To store strings in MySQL with LOB behavior, use one of the <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> types,
									which the driver will treat as a
									<code class="literal">java.sql.Clob</code>
									.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>Debug builds</strong></span>:
									Starting with Connector/J 3.1.8 a debug build of the driver in
									a file named
									<code class="filename">
										mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin-g.jar
									</code>
									is shipped alongside the normal binary jar file that is named
									<code class="filename">
										mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin.jar
									</code>
									.
								</p>
								<p>
									Starting with Connector/J 3.1.9, we do not ship the
									<code class="literal">.class</code>
									files unbundled, they are only available in the JAR archives
									that ship with the driver.
								</p>
								<p>
									Do not use the debug build of the driver unless instructed to
									do so when reporting a problem or bug, as it is not designed to
									be run in production environments, and will have adverse
									performance impact when used. The debug binary also depends on
									the Aspect/J runtime library, which is located in the
									<code class="filename">src/lib/aspectjrt.jar</code>
									file that comes with the Connector/J distribution.
								</p></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-installing-source"></a>3.4. Installing from
								the Development Source Tree
							</h2>
						</div>
					</div>
				</div>
				<div xmlns="http://www.w3.org/1999/xhtml" class="caution"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Caution</div>
					<p xmlns="">Read this section only if you are interested in
						helping us test our new code. To just get MySQL Connector/J up and
						running on your system, use a standard binary release
						distribution.</p>
				</div>
				<p>To install MySQL Connector/J from the development source
					tree, make sure that you have the following prerequisites:</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								A Bazaar client, to check out the sources from our Launchpad
								repository (available from <a class="ulink"
									href="http://bazaar-vcs.org/" target="_top">http://bazaar-vcs.org/</a>).
							</p></li>
						<li class="listitem"><p>
								Apache Ant version 1.7 or newer (available from <a class="ulink"
									href="http://ant.apache.org/" target="_top">http://ant.apache.org/</a>).
							</p></li>
						<li class="listitem"><p>
								JDK 1.4.2 or later. Although MySQL Connector/J can be be used
								with older JDKs, compiling it from source requires at least JDK
								1.4.2. To build Connector/J 5.1 requires JDK 1.6.x <span
									class="emphasis"><em>and</em></span> an older JDK such as JDK
								1.5.x; point your
								<code class="literal">JAVA_HOME</code>
								environment variable at the older installation.
							</p></li>
					</ul>
				</div>
				<p>To check out and compile a specific branch of MySQL
					Connector/J, follow these steps:</p>
				<div class="orderedlist">
					<ol class="orderedlist" type="1">
						<li class="listitem"><p>Check out the latest code from
								the branch that you want with one of the following commands.</p>
							<p>
								The source code repository for MySQL Connector/J is located on
								Launchpad at <a class="ulink"
									href="https://code.launchpad.net/connectorj" target="_top">https://code.launchpad.net/connectorj</a>.
								To check out the latest development branch, use:
							</p>
							<pre class="programlisting">shell&gt; <strong
									class="userinput"><code>bzr branch lp:connectorj</code></strong>i
</pre>
							<p>
								This creates a
								<code class="filename">connectorj</code>
								subdirectory in the current directory that contains the latest
								sources for the requested branch.
							</p>
							<p>To check out the latest 5.1 code, use:</p>
							<pre class="programlisting">shell&gt; <strong
									class="userinput"><code>bzr branch lp:connectorj/5.1</code></strong>
</pre>
							<p>
								This creates a
								<code class="filename">5.1</code>
								subdirectory in the current directory containing the latest 5.1
								code.
							</p></li>
						<li class="listitem"><p>
								To build Connector/J 5.1, make sure that you have both JDK 1.6.x
								installed and an older JDK such as JDK 1.5.x. This is because
								Connector/J supports both JDBC 3.0 (which was prior to JDK
								1.6.x) and JDBC 4.0. Set your
								<code class="literal">JAVA_HOME</code>
								environment variable to the path of the older JDK installation.
							</p></li>
						<li class="listitem"><p>
								Change your current working directory to either the
								<code class="filename">connectorj</code>
								or
								<code class="filename">5.1</code>
								directory, depending on which branch you intend to build.
							</p></li>
						<li class="listitem"><p>
								To build Connector/J 5.1, edit the
								<code class="filename">build.xml</code>
								to reflect the location of your JDK 1.6.x installation. The
								lines to change are:
							</p>
							<pre class="programlisting">            &lt;property name="com.mysql.jdbc.java6.javac" value="C:\jvms\jdk1.6.0\bin\javac.exe" /&gt;
            &lt;property name="com.mysql.jdbc.java6.rtjar" value="C:\jvms\jdk1.6.0\jre\lib\rt.jar" /&gt;</pre>
							<p>
								Alternatively, you can set the value of these property names
								through the Ant
								<code class="option">-D</code>
								option.
							</p></li>
						<li class="listitem"><p>
								Issue the following command to compile the driver and create a
								<code class="filename">.jar</code>
								file suitable for installation:
							</p>
							<pre class="programlisting">shell&gt; <strong
									class="userinput"><code>ant dist</code></strong>
</pre>
							<p>
								This creates a
								<code class="filename">build</code>
								directory in the current directory, where all build output will
								go. A directory is created in the
								<code class="filename">build</code>
								directory that includes the version number of the sources you
								are building from. This directory contains the sources, compiled
								<code class="filename">.class</code>
								files, and a
								<code class="filename">.jar</code>
								file suitable for deployment. For other possible targets,
								including ones that will create a fully packaged distribution,
								issue the following command:
							</p>
							<pre class="programlisting">shell&gt; <strong
									class="userinput"><code>ant -projecthelp</code></strong>
</pre></li>
						<li class="listitem"><p>
								A newly created
								<code class="filename">.jar</code>
								file containing the JDBC driver will be placed in the directory
								<code class="filename">
									build/mysql-connector-java-<em class="replaceable"><code>version</code></em>
								</code>
								.
							</p>
							<p>
								Install the newly created JDBC driver as you would a binary
								<code class="filename">.jar</code>
								file that you download from MySQL, by following the instructions
								in <a class="xref" href="#connector-j-installing-classpath"
									title="3.2. Installing the Driver and Configuring the CLASSPATH">Section 3.2,
									“Installing the Driver and Configuring the <code
										class="literal">CLASSPATH</code>”
								</a>.
							</p></li>
					</ol>
				</div>
				<p>
					A package containing both the binary and source code for
					Connector/J 5.1 can also be found at the following location: <a
						class="ulink"
						href="http://dev.mysql.com/downloads/connector/j/5.1.html"
						target="_top"> Connector/J 5.1 Download</a>
				</p>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-examples"></a>Chapter 4. Connector/J
							Examples
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id553024"></a>
			<p>Examples of using Connector/J are located throughout this
				document. This section provides a summary and links to these
				examples.</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<a class="xref"
								href="#connector-j-examples-connection-drivermanager"
								title="Example 6.1. Connector/J: Obtaining a connection from the DriverManager">Example 6.1,
								“Connector/J: Obtaining a connection from the <code
									class="literal">DriverManager</code>”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-execute-select"
								title="Example 6.2. Connector/J: Using java.sql.Statement to execute a SELECT query">Example 6.2,
								“Connector/J: Using java.sql.Statement to execute a <code
									class="literal">SELECT</code> query”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-stored-procedure"
								title="Example 6.3. Connector/J: Calling Stored Procedures">Example 6.3,
								“Connector/J: Calling Stored Procedures”</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-preparecall"
								title="Example 6.4. Connector/J: Using Connection.prepareCall()">Example 6.4,
								“Connector/J: Using <code class="literal">Connection.prepareCall()</code>”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-output-param"
								title="Example 6.5. Connector/J: Registering output parameters">Example 6.5,
								“Connector/J: Registering output parameters”</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-callablestatement"
								title="Example 6.6. Connector/J: Setting CallableStatement input parameters">Example 6.6,
								“Connector/J: Setting <code class="literal">CallableStatement</code>
								input parameters”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref"
								href="#connector-j-examples-retrieving-results-params"
								title="Example 6.7. Connector/J: Retrieving results and output parameter values">Example 6.7,
								“Connector/J: Retrieving results and output parameter values”</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref"
								href="#connector-j-examples-autoincrement-getgeneratedkeys"
								title="Example 6.8. Connector/J: Retrieving AUTO_INCREMENT column values using Statement.getGeneratedKeys()">Example 6.8,
								“Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
								column values using <code class="literal">Statement.getGeneratedKeys()</code>”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-autoincrement-select"
								title="Example 6.9. Connector/J: Retrieving AUTO_INCREMENT column values using SELECT LAST_INSERT_ID()">Example 6.9,
								“Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
								column values using <code class="literal">SELECT
									LAST_INSERT_ID()</code>”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref"
								href="#connector-j-examples-autoincrement-updateable-resultsets"
								title="Example 6.10. Connector/J: Retrieving AUTO_INCREMENT column values in Updatable ResultSets">Example 6.10,
								“Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
								column values in <code class="literal">Updatable
									ResultSets</code>”
							</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-connectionpool-j2ee"
								title="Example 7.1. Connector/J: Using a connection pool with a J2EE application server">Example 7.1,
								“Connector/J: Using a connection pool with a J2EE application
								server”</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#connector-j-examples-transaction-retry"
								title="Example 15.1. Connector/J: Example of transaction with retry logic">Example 15.1,
								“Connector/J: Example of transaction with retry logic”</a>
						</p></li>
				</ul>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-reference"></a>Chapter 5. Connector/J (JDBC)
							Reference
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-configuration-properties">5.1.
								Driver/Datasource Class Names, URL Syntax and Configuration
								Properties for Connector/J</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#connector-j-useconfigs">5.1.1.
										Properties Files for the <code class="literal">useConfigs</code>
										Option
								</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-implementation-notes">5.2. JDBC
								API Implementation Notes</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-type-conversions">5.3. Java,
								JDBC and MySQL Types</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-charsets">5.4. Using Character
								Sets and Unicode</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-using-ssl">5.5. Connecting
								Securely Using SSL</a></span>
					</dt>
					<dt>
						<span class="section"><a href="#connector-j-using-pam">5.6.
								Connecting Using PAM Authentication</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-replication-connection">5.7.
								Using Master/Slave Replication with ReplicationConnection</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-reference-error-sqlstates">5.8. Mapping
								MySQL Error Numbers to JDBC SQLState Codes</a></span>
					</dt>
				</dl>
			</div>
			<p>This section of the manual contains reference material for
				MySQL Connector/J.</p>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-configuration-properties"></a>5.1. Driver/Datasource
								Class Names, URL Syntax and Configuration Properties for
								Connector/J
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#connector-j-useconfigs">5.1.1.
									Properties Files for the <code class="literal">useConfigs</code>
									Option
							</a></span>
						</dt>
					</dl>
				</div>
				<a class="indexterm" name="id553218"></a><a class="indexterm"
					name="id553230"></a>
				<p>
					The name of the class that implements
					<code class="literal">java.sql.Driver</code>
					in MySQL Connector/J is
					<code class="literal">com.mysql.jdbc.Driver</code>
					. The
					<code class="literal">org.gjt.mm.mysql.Driver</code>
					class name is also usable for backward compatibility with MM.MySQL,
					the predecessor of Connector/J. Use this class name when
					registering the driver, or when otherwise configuring software to
					use MySQL Connector/J.
				</p>
				<h3>
					<a name="id553267"></a> JDBC URL Format
				</h3>
				<p>The JDBC URL format for MySQL Connector/J is as follows, with
					items in square brackets ([, ]) being optional:</p>
				<pre class="programlisting">jdbc:mysql://[<em
						class="replaceable"><code>host</code></em>][,<em
						class="replaceable"><code>failoverhost</code></em>...][:<em
						class="replaceable"><code>port</code></em>]/[<em
						class="replaceable"><code>database</code></em>] »
[?<em class="replaceable"><code>propertyName1</code></em>][=<em
						class="replaceable"><code>propertyValue1</code></em>][&amp;<em
						class="replaceable"><code>propertyName2</code></em>][=<em
						class="replaceable"><code>propertyValue2</code></em>]...
</pre>
				<p>
					If the host name is not specified, it defaults to
					<code class="literal">127.0.0.1</code>
					. If the port is not specified, it defaults to
					<code class="literal">3306</code>
					, the default port number for MySQL servers.
				</p>
				<pre class="programlisting">jdbc:mysql://[<em
						class="replaceable"><code>host</code></em>:<em class="replaceable"><code>port</code></em>],[<em
						class="replaceable"><code>host</code></em>:<em class="replaceable"><code>port</code></em>].../[<em
						class="replaceable"><code>database</code></em>] »
[?<em class="replaceable"><code>propertyName1</code></em>][=<em
						class="replaceable"><code>propertyValue1</code></em>][&amp;<em
						class="replaceable"><code>propertyName2</code></em>][=<em
						class="replaceable"><code>propertyValue2</code></em>]...
</pre>
				<p>Here is a sample connection URL:</p>
				<pre class="programlisting">jdbc:mysql://localhost:3306/sakila?profileSQL=true</pre>
				<h3>
					<a name="id553374"></a> IPv6 Connections
				</h3>
				<a class="indexterm" name="id553377"></a>
				<p>
					For IPv6 connections, use this alternative syntax to specify hosts
					in the URL,
					<code class="literal">
						address=(<em class="replaceable"><code>key</code></em>=<em
							class="replaceable"><code>value</code></em>)
					</code>
					. Supported keys are:
				</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								<code class="literal">(protocol=tcp)</code>
								, or
								<code class="literal">(protocol=pipe)</code>
								for named pipes on Windows.
							</p></li>
						<li class="listitem"><p>
								<code class="literal">
									(path=<em class="replaceable"><code>path_to_pipe</code></em>)
								</code>
								for named pipes.
							</p></li>
						<li class="listitem"><p>
								<code class="literal">
									(host=<em class="replaceable"><code>hostname</code></em>)
								</code>
								for TCP connections.
							</p></li>
						<li class="listitem"><p>
								<code class="literal">
									(port=<em class="replaceable"><code>port_number</code></em>)
								</code>
								for TCP connections.
							</p></li>
					</ul>
				</div>
				<p>For example:</p>
				<pre class="programlisting">jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(user=test)/db </pre>
				<p>Any other parameters are treated as host-specific properties
					that follow the conventions of the JDBC URL properties. This now
					allows per-host overrides of any configuration property for
					multi-host connections (that is, when using failover, load
					balancing, or replication). Limit the overrides to user, password,
					network timeouts and statement and metadata cache sizes; the
					results of other per-host overrides are not defined.</p>
				<h3>
					<a name="id553495"></a> Initial Database for Connection
				</h3>
				<p>
					If the database is not specified, the connection is made with no
					default database. In this case, either call the
					<code class="function">setCatalog()</code>
					method on the Connection instance, or fully specify table names
					using the database name (that is,
					<code class="literal">
						SELECT <em class="replaceable"><code>dbname</code></em>.<em
							class="replaceable"><code>tablename</code></em>.<em
							class="replaceable"><code>colname</code></em> FROM
						dbname.tablename...
					</code>
					) in your SQL. Opening a connection without specifying the database
					to use is generally only useful when building tools that work with
					multiple databases, such as GUI database managers.
				</p>
				<div xmlns="http://www.w3.org/1999/xhtml" class="note"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Note</div>
					<p xmlns="">
						Always use the
						<code class="literal">Connection.setCatalog()</code>
						method to specify the desired database in JDBC applications,
						rather than the
						<code class="literal">
							USE <em class="replaceable"><code>database</code></em>
						</code>
						statement.
					</p>
				</div>
				<h3>
					<a name="id553550"></a> Failover Support
				</h3>
				<a class="indexterm" name="id553554"></a>
				<p>
					MySQL Connector/J has failover support. This enables the driver to
					fail over to any number of slave hosts and still perform read-only
					queries. Failover only happens when the connection is in an
					<code class="function">autoCommit(true)</code>
					state, because failover cannot happen reliably when a <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_transaction"
						target="_top">transaction</a> is in progress. Most application
					servers and connection pools set
					<code class="literal">autoCommit</code>
					to
					<code class="literal">true</code>
					at the end of every transaction/connection use.
				</p>
				<p>The failover functionality has the following behavior:</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								If the URL property
								<code class="literal">autoReconnect</code>
								is
								<code class="literal">false</code>
								: Failover only happens at connection initialization, and
								failback occurs when the driver determines that the first host
								has become available again.
							</p></li>
						<li class="listitem"><p>
								If the URL property
								<code class="literal">autoReconnect</code>
								is
								<code class="literal">true</code>
								: Failover happens when the driver determines that the
								connection has failed (checked before <span class="emphasis"><em>every</em></span>
								query), and falls back to the first host when it determines that
								the host has become available again (after
								<code class="literal">queriesBeforeRetryMaster</code>
								queries have been issued).
							</p></li>
					</ul>
				</div>
				<p>
					In either case, whenever you are connected to a <span class="quote">“<span
						class="quote">failed-over</span>”
					</span> server, the connection is set to read-only state, so queries that
					attempt to modify data will throw exceptions (the query will <span
						class="bold"><strong>never</strong></span> be processed by the
					MySQL server).
				</p>
				<h3>
					<a name="id553671"></a> Setting Configuration Properties
				</h3>
				<p>
					Configuration properties define how Connector/J will make a
					connection to a MySQL server. Unless otherwise noted, properties
					can be set for a
					<code class="literal">DataSource</code>
					object or for a
					<code class="literal">Connection</code>
					object.
				</p>
				<p>Configuration properties can be set in one of the following
					ways:</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								Using the
								<code class="literal">set*()</code>
								methods on MySQL implementations of
								<code class="literal">java.sql.DataSource</code>
								(which is the preferred method when using implementations of
								<code class="literal">java.sql.DataSource</code>
								):
							</p>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>
											<code class="literal">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</code>
										</p></li>
									<li class="listitem"><p>
											<code class="literal">com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</code>
										</p></li>
								</ul>
							</div></li>
						<li class="listitem"><p>
								As a key/value pair in the
								<code class="literal">java.util.Properties</code>
								instance passed to
								<code class="literal">DriverManager.getConnection()</code>
								or
								<code class="literal">Driver.connect()</code>
							</p></li>
						<li class="listitem"><p>
								As a JDBC URL parameter in the URL given to
								<code class="literal">java.sql.DriverManager.getConnection()</code>
								,
								<code class="literal">java.sql.Driver.connect()</code>
								or the MySQL implementations of the
								<code class="literal">javax.sql.DataSource</code>
								<code class="function">setURL()</code>
								method.
							</p>
							<div xmlns="http://www.w3.org/1999/xhtml" class="note"
								style="margin-left: 0.5in; margin-right: 0.5in;">
								<div class="admon-title">Note</div>
								<p xmlns="">If the mechanism you use to configure a JDBC URL
									is XML-based, use the XML character literal &amp;amp; to
									separate configuration parameters, as the ampersand is a
									reserved character for XML.</p>
							</div></li>
					</ul>
				</div>
				<p>The properties are listed in the following tables.</p>
				<p>
					<b>Connection/Authentication. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">user</code></td>
								<td>The user to connect as</td>
								<td><code class="literal"></code></td>
								<td>all versions</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">password</code></td>
								<td>The password to use when connecting</td>
								<td><code class="literal"></code></td>
								<td>all versions</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">socketFactory</code></td>
								<td>The name of the class that the driver should use for
									creating socket connections to the server. This class must
									implement the interface 'com.mysql.jdbc.SocketFactory' and have
									public no-args constructor.</td>
								<td><code class="literal">com.mysql.jdbc.StandardSocketFactory</code></td>
								<td>3.0.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">connectTimeout</code></td>
								<td>Timeout for socket connect (in milliseconds), with 0
									being no timeout. Only works on JDK-1.4 or newer. Defaults to
									'0'.</td>
								<td><code class="literal">0</code></td>
								<td>3.0.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">socketTimeout</code></td>
								<td>Timeout on network socket operations (0, the default
									means no timeout).</td>
								<td><code class="literal">0</code></td>
								<td>3.0.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">connectionLifecycleInterceptors</code></td>
								<td>A comma-delimited list of classes that implement
									"com.mysql.jdbc.ConnectionLifecycleInterceptor" that should
									notified of connection lifecycle events (creation, destruction,
									commit, rollback, setCatalog and setAutoCommit) and potentially
									alter the execution of these commands.
									ConnectionLifecycleInterceptors are "stackable", more than one
									interceptor may be specified via the configuration property as
									a comma-delimited list, with the interceptors executed in order
									from left to right.</td>
								<td><code class="literal"></code></td>
								<td>5.1.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useConfigs</code></td>
								<td>Load the comma-delimited list of configuration
									properties before parsing the URL or applying user-specified
									properties. These configurations are explained in the
									'Configurations' of the documentation.</td>
								<td><code class="literal"></code></td>
								<td>3.1.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">authenticationPlugins</code></td>
								<td>Comma-delimited list of classes that implement
									com.mysql.jdbc.AuthenticationPlugin and which will be used for
									authentication unless disabled by
									"disabledAuthenticationPlugins" property.</td>
								<td><code class="literal"></code></td>
								<td>5.1.19</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">defaultAuthenticationPlugin</code></td>
								<td>Name of a class implementing
									com.mysql.jdbc.AuthenticationPlugin which will be used as the
									default authentication plugin (see below). It is an error to
									use a class which is not listed in "authenticationPlugins" nor
									it is one of the built-in plugins. It is an error to set as
									default a plugin which was disabled with
									"disabledAuthenticationPlugins" property. It is an error to set
									this value to null or the empty string (i.e. there must be at
									least a valid default authentication plugin specified for the
									connection, meeting all constraints listed above).</td>
								<td><code class="literal">com.mysql.jdbc.authentication.MysqlNativePasswordPlugin</code></td>
								<td>5.1.19</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">disabledAuthenticationPlugins</code></td>
								<td>Comma-delimited list of classes implementing
									com.mysql.jdbc.AuthenticationPlugin or mechanisms, i.e.
									"mysql_native_password". The authentication plugins or
									mechanisms listed will not be used for authentication which
									will fail if it requires one of them. It is an error to disable
									the default authentication plugin (either the one named by
									"defaultAuthenticationPlugin" property or the hard-coded one if
									"defaultAuthenticationPlugin" propery is not set).</td>
								<td><code class="literal"></code></td>
								<td>5.1.19</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">interactiveClient</code></td>
								<td>Set the CLIENT_INTERACTIVE flag, which tells MySQL to
									timeout connections based on INTERACTIVE_TIMEOUT instead of
									WAIT_TIMEOUT</td>
								<td><code class="literal">false</code></td>
								<td>3.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">localSocketAddress</code></td>
								<td>Hostname or IP address given to explicitly configure
									the interface that the driver will bind the client side of the
									TCP/IP connection to when connecting.</td>
								<td><code class="literal"></code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">propertiesTransform</code></td>
								<td>An implementation of
									com.mysql.jdbc.ConnectionPropertiesTransform that the driver
									will use to modify URL properties passed to the driver before
									attempting a connection</td>
								<td><code class="literal"></code></td>
								<td>3.1.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useCompression</code></td>
								<td>Use zlib compression when communicating with the server
									(true/false)? Defaults to 'false'.</td>
								<td><code class="literal">false</code></td>
								<td>3.0.17</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>Networking. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">maxAllowedPacket</code></td>
								<td>Maximum allowed packet size to send to server. If not
									set, the value of system variable 'max_allowed_packet' will be
									used to initialize this upon connecting. This value will not
									take effect if set larger than the value of
									'max_allowed_packet'.</td>
								<td><code class="literal">-1</code></td>
								<td>5.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tcpKeepAlive</code></td>
								<td>If connecting using TCP/IP, should the driver set
									SO_KEEPALIVE?</td>
								<td><code class="literal">true</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tcpNoDelay</code></td>
								<td>If connecting using TCP/IP, should the driver set
									SO_TCP_NODELAY (disabling the Nagle Algorithm)?</td>
								<td><code class="literal">true</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tcpRcvBuf</code></td>
								<td>If connecting using TCP/IP, should the driver set
									SO_RCV_BUF to the given value? The default value of '0', means
									use the platform default value for this property)</td>
								<td><code class="literal">0</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tcpSndBuf</code></td>
								<td>If connecting using TCP/IP, should the driver set
									SO_SND_BUF to the given value? The default value of '0', means
									use the platform default value for this property)</td>
								<td><code class="literal">0</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tcpTrafficClass</code></td>
								<td>If connecting using TCP/IP, should the driver set
									traffic class or type-of-service fields ?See the documentation
									for java.net.Socket.setTrafficClass() for more information.</td>
								<td><code class="literal">0</code></td>
								<td>5.0.7</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>High Availability and Clustering. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoReconnect</code></td>
								<td>Should the driver try to re-establish stale and/or dead
									connections? If enabled the driver will throw an exception for
									a queries issued on a stale or dead connection, which belong to
									the current transaction, but will attempt reconnect before the
									next query issued on the connection in a new transaction. The
									use of this feature is not recommended, because it has side
									effects related to session state and data consistency when
									applications don't handle SQLExceptions properly, and is only
									designed to be used when you are unable to configure your
									application to handle SQLExceptions resulting from dead and
									stale connections properly. Alternatively, as a last option,
									investigate setting the MySQL server variable "wait_timeout" to
									a high value, rather than the default of 8 hours.</td>
								<td><code class="literal">false</code></td>
								<td>1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoReconnectForPools</code></td>
								<td>Use a reconnection strategy appropriate for connection
									pools (defaults to 'false')</td>
								<td><code class="literal">false</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">failOverReadOnly</code></td>
								<td>When failing over in autoReconnect mode, should the
									connection be set to 'read-only'?</td>
								<td><code class="literal">true</code></td>
								<td>3.0.12</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">maxReconnects</code></td>
								<td>Maximum number of reconnects to attempt if
									autoReconnect is true, default is '3'.</td>
								<td><code class="literal">3</code></td>
								<td>1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">reconnectAtTxEnd</code></td>
								<td>If autoReconnect is set to true, should the driver
									attempt reconnections at the end of every transaction?</td>
								<td><code class="literal">false</code></td>
								<td>3.0.10</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">retriesAllDown</code></td>
								<td>When using loadbalancing, the number of times the
									driver should cycle through available hosts, attempting to
									connect. Between cycles, the driver will pause for 250ms if no
									servers are available.</td>
								<td><code class="literal">120</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">initialTimeout</code></td>
								<td>If autoReconnect is enabled, the initial time to wait
									between re-connect attempts (in seconds, defaults to '2').</td>
								<td><code class="literal">2</code></td>
								<td>1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">roundRobinLoadBalance</code></td>
								<td>When autoReconnect is enabled, and failoverReadonly is
									false, should we pick hosts to connect to on a round-robin
									basis?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">queriesBeforeRetryMaster</code></td>
								<td>Number of queries to issue before falling back to
									master when failed over (when using multi-host failover).
									Whichever condition is met first, 'queriesBeforeRetryMaster' or
									'secondsBeforeRetryMaster' will cause an attempt to be made to
									reconnect to the master. Defaults to 50.</td>
								<td><code class="literal">50</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">secondsBeforeRetryMaster</code></td>
								<td>How long should the driver wait, when failed over,
									before attempting</td>
								<td><code class="literal">30</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">selfDestructOnPingMaxOperations</code></td>
								<td>=If set to a non-zero value, the driver will report
									close the connection and report failure when Connection.ping()
									or Connection.isValid(int) is called if the connnection's count
									of commands sent to the server exceeds this value.</td>
								<td><code class="literal">0</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">selfDestructOnPingSecondsLifetime</code></td>
								<td>If set to a non-zero value, the driver will report
									close the connection and report failure when Connection.ping()
									or Connection.isValid(int) is called if the connnection's
									lifetime exceeds this value.</td>
								<td><code class="literal">0</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">resourceId</code></td>
								<td>A globally unique name that identifies the resource
									that this datasource or connection is connected to, used for
									XAResource.isSameRM() when the driver can't determine this
									value based on hostnames used in the URL</td>
								<td><code class="literal"></code></td>
								<td>5.0.1</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>Security. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">allowMultiQueries</code></td>
								<td>Allow the use of ';' to delimit multiple queries during
									one statement (true/false), defaults to 'false', and does not
									affect the addBatch() and executeBatch() methods, which instead
									rely on rewriteBatchStatements.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useSSL</code></td>
								<td>Use SSL when communicating with the server
									(true/false), defaults to 'false'</td>
								<td><code class="literal">false</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">requireSSL</code></td>
								<td>Require SSL connection if useSSL=true? (defaults to
									'false').</td>
								<td><code class="literal">false</code></td>
								<td>3.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">verifyServerCertificate</code></td>
								<td>If "useSSL" is set to "true", should the driver verify
									the server's certificate? When using this feature, the keystore
									parameters should be specified by the
									"clientCertificateKeyStore*" properties, rather than system
									properties.</td>
								<td><code class="literal">true</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clientCertificateKeyStoreUrl</code></td>
								<td>URL to the client certificate KeyStore (if not
									specified, use defaults)</td>
								<td><code class="literal"></code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clientCertificateKeyStoreType</code></td>
								<td>KeyStore type for client certificates (NULL or empty
									means use the default, which is "JKS". Standard keystore types
									supported by the JVM are "JKS" and "PKCS12", your environment
									may have more available depending on what security products are
									installed and available to the JVM.</td>
								<td><code class="literal">JKS</code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clientCertificateKeyStorePassword</code></td>
								<td>Password for the client certificates KeyStore</td>
								<td><code class="literal"></code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">trustCertificateKeyStoreUrl</code></td>
								<td>URL to the trusted root certificate KeyStore (if not
									specified, use defaults)</td>
								<td><code class="literal"></code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">trustCertificateKeyStoreType</code></td>
								<td>KeyStore type for trusted root certificates (NULL or
									empty means use the default, which is "JKS". Standard keystore
									types supported by the JVM are "JKS" and "PKCS12", your
									environment may have more available depending on what security
									products are installed and available to the JVM.</td>
								<td><code class="literal">JKS</code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">trustCertificateKeyStorePassword</code></td>
								<td>Password for the trusted root certificates KeyStore</td>
								<td><code class="literal"></code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">allowLoadLocalInfile</code></td>
								<td>Should the driver allow use of 'LOAD DATA LOCAL
									INFILE...' (defaults to 'true').</td>
								<td><code class="literal">true</code></td>
								<td>3.0.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">allowUrlInLocalInfile</code></td>
								<td>Should the driver allow URLs in 'LOAD DATA LOCAL
									INFILE' statements?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">paranoid</code></td>
								<td>Take measures to prevent exposure sensitive information
									in error messages and clear data structures holding sensitive
									data when possible? (defaults to 'false')</td>
								<td><code class="literal">false</code></td>
								<td>3.0.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">passwordCharacterEncoding</code></td>
								<td>What character encoding is used for passwords? Leaving
									this set to the default value (null), uses the platform
									character set, which works for ISO8859_1 (i.e. "latin1")
									passwords. For passwords in other character encodings, the
									encoding will have to be specified with this property, as it's
									not possible for the driver to auto-detect this.</td>
								<td><code class="literal"></code></td>
								<td>5.1.7</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>Performance Extensions. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">callableStmtCacheSize</code></td>
								<td>If 'cacheCallableStmts' is enabled, how many callable
									statements should be cached?</td>
								<td><code class="literal">100</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">metadataCacheSize</code></td>
								<td>The number of queries to cache ResultSetMetadata for if
									cacheResultSetMetaData is set to 'true' (default 50)</td>
								<td><code class="literal">50</code></td>
								<td>3.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useLocalSessionState</code></td>
								<td>Should the driver refer to the internal values of
									autocommit and transaction isolation that are set by
									Connection.setAutoCommit() and
									Connection.setTransactionIsolation() and transaction state as
									maintained by the protocol, rather than querying the database
									or blindly sending commands to the database for commit() or
									rollback() method calls?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useLocalTransactionState</code></td>
								<td>Should the driver use the in-transaction state provided
									by the MySQL protocol to determine if a commit() or rollback()
									should actually be sent to the database?</td>
								<td><code class="literal">false</code></td>
								<td>5.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">prepStmtCacheSize</code></td>
								<td>If prepared statement caching is enabled, how many
									prepared statements should be cached?</td>
								<td><code class="literal">25</code></td>
								<td>3.0.10</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">prepStmtCacheSqlLimit</code></td>
								<td>If prepared statement caching is enabled, what's the
									largest SQL the driver will cache the parsing for?</td>
								<td><code class="literal">256</code></td>
								<td>3.0.10</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">parseInfoCacheFactory</code></td>
								<td>Name of a class implementing
									com.mysql.jdbc.CacheAdapterFactory, which will be used to
									create caches for the parsed representation of client-side
									prepared statements.</td>
								<td><code class="literal">com.mysql.jdbc.PerConnectionLRUFactory</code></td>
								<td>5.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">alwaysSendSetIsolation</code></td>
								<td>Should the driver always communicate with the database
									when Connection.setTransactionIsolation() is called? If set to
									false, the driver will only communicate with the database when
									the requested transaction isolation is different than the
									whichever is newer, the last value that was set via
									Connection.setTransactionIsolation(), or the value that was
									read from the server when the connection was established. Note
									that useLocalSessionState=true will force the same behavior as
									alwaysSendSetIsolation=false, regardless of how
									alwaysSendSetIsolation is set.</td>
								<td><code class="literal">true</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">maintainTimeStats</code></td>
								<td>Should the driver maintain various internal timers to
									enable idle time calculations as well as more verbose error
									messages when the connection to the server fails? Setting this
									property to false removes at least two calls to
									System.getCurrentTimeMillis() per query.</td>
								<td><code class="literal">true</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useCursorFetch</code></td>
								<td>If connected to MySQL &gt; 5.0.2, and setFetchSize()
									&gt; 0 on a statement, should that statement use cursor-based
									fetching to retrieve rows?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">blobSendChunkSize</code></td>
								<td>Chunk to use when sending BLOB/CLOBs via
									ServerPreparedStatements</td>
								<td><code class="literal">1048576</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cacheCallableStmts</code></td>
								<td>Should the driver cache the parsing stage of
									CallableStatements</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cachePrepStmts</code></td>
								<td>Should the driver cache the parsing stage of
									PreparedStatements of client-side prepared statements, the
									"check" for suitability of server-side prepared and server-side
									prepared statements themselves?</td>
								<td><code class="literal">false</code></td>
								<td>3.0.10</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cacheResultSetMetadata</code></td>
								<td>Should the driver cache ResultSetMetaData for
									Statements and PreparedStatements? (Req. JDK-1.4+, true/false,
									default 'false')</td>
								<td><code class="literal">false</code></td>
								<td>3.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cacheServerConfiguration</code></td>
								<td>Should the driver cache the results of 'SHOW VARIABLES'
									and 'SHOW COLLATION' on a per-URL basis?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">defaultFetchSize</code></td>
								<td>The driver will call setFetchSize(n) with this value on
									all newly-created Statements</td>
								<td><code class="literal">0</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">dontTrackOpenResources</code></td>
								<td>The JDBC specification requires the driver to
									automatically track and close resources, however if your
									application doesn't do a good job of explicitly calling close()
									on statements or result sets, this can cause memory leakage.
									Setting this property to true relaxes this constraint, and can
									be more memory efficient for some applications.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">dynamicCalendars</code></td>
								<td>Should the driver retrieve the default calendar when
									required, or cache it per connection/session?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">elideSetAutoCommits</code></td>
								<td>If using MySQL-4.1 or newer, should the driver only
									issue 'set autocommit=n' queries when the server's state
									doesn't match the requested state by
									Connection.setAutoCommit(boolean)?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">enableQueryTimeouts</code></td>
								<td>When enabled, query timeouts set via
									Statement.setQueryTimeout() use a shared java.util.Timer
									instance for scheduling. Even if the timeout doesn't expire
									before the query is processed, there will be memory used by the
									TimerTask for the given timeout which won't be reclaimed until
									the time the timeout would have expired if it hadn't been
									cancelled by the driver. High-load environments might want to
									consider disabling this functionality.</td>
								<td><code class="literal">true</code></td>
								<td>5.0.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">holdResultsOpenOverStatementClose</code></td>
								<td>Should the driver close result sets on
									Statement.close() as required by the JDBC specification?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">largeRowSizeThreshold</code></td>
								<td>What size result set row should the JDBC driver
									consider "large", and thus use a more memory-efficient way of
									representing the row internally?</td>
								<td><code class="literal">2048</code></td>
								<td>5.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceStrategy</code></td>
								<td>If using a load-balanced connection to connect to SQL
									nodes in a MySQL Cluster/NDB configuration (by using the URL
									prefix "jdbc:mysql:loadbalance://"), which load balancing
									algorithm should the driver use: (1) "random" - the driver will
									pick a random host for each request. This tends to work better
									than round-robin, as the randomness will somewhat account for
									spreading loads where requests vary in response time, while
									round-robin can sometimes lead to overloaded nodes if there are
									variations in response times across the workload. (2)
									"bestResponseTime" - the driver will route the request to the
									host that had the best response time for the previous
									transaction.</td>
								<td><code class="literal">random</code></td>
								<td>5.0.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">locatorFetchBufferSize</code></td>
								<td>If 'emulateLocators' is configured to 'true', what size
									buffer should be used when fetching BLOB data for
									getBinaryInputStream?</td>
								<td><code class="literal">1048576</code></td>
								<td>3.2.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">rewriteBatchedStatements</code></td>
								<td>Should the driver use multiqueries (irregardless of the
									setting of "allowMultiQueries") as well as rewriting of
									prepared statements for INSERT into multi-value inserts when
									executeBatch() is called? Notice that this has the potential
									for SQL injection if using plain java.sql.Statements and your
									code doesn't sanitize input correctly. Notice that for prepared
									statements, server-side prepared statements can not currently
									take advantage of this rewrite option, and that if you don't
									specify stream lengths when using
									PreparedStatement.set*Stream(), the driver won't be able to
									determine the optimum number of parameters per batch and you
									might receive an error from the driver that the resultant
									packet is too large. Statement.getGeneratedKeys() for these
									rewritten statements only works when the entire batch includes
									INSERT statements.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useDirectRowUnpack</code></td>
								<td>Use newer result set row unpacking code that skips a
									copy from network buffers to a MySQL packet instance and
									instead reads directly into the result set row data buffers.</td>
								<td><code class="literal">true</code></td>
								<td>5.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useDynamicCharsetInfo</code></td>
								<td>Should the driver use a per-connection cache of
									character set information queried from the server when
									necessary, or use a built-in static mapping that is more
									efficient, but isn't aware of custom character sets or
									character sets implemented after the release of the JDBC
									driver?</td>
								<td><code class="literal">true</code></td>
								<td>5.0.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useFastDateParsing</code></td>
								<td>Use internal String-&gt;Date/Time/Timestamp conversion
									routines to avoid excessive object creation?</td>
								<td><code class="literal">true</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useFastIntParsing</code></td>
								<td>Use internal String-&gt;Integer conversion routines to
									avoid excessive object creation?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useJvmCharsetConverters</code></td>
								<td>Always use the character encoding routines built into
									the JVM, rather than using lookup tables for single-byte
									character sets?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useReadAheadInput</code></td>
								<td>Use newer, optimized non-blocking, buffered input
									stream when reading from the server?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.5</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>Debugging/Profiling. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">logger</code></td>
								<td>The name of a class that implements
									"com.mysql.jdbc.log.Log" that will be used to log messages to.
									(default is "com.mysql.jdbc.log.StandardLogger", which logs to
									STDERR)</td>
								<td><code class="literal">com.mysql.jdbc.log.StandardLogger</code></td>
								<td>3.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">gatherPerfMetrics</code></td>
								<td>Should the driver gather performance metrics, and
									report them via the configured logger every
									'reportMetricsIntervalMillis' milliseconds?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">profileSQL</code></td>
								<td>Trace queries and their execution/fetch times to the
									configured logger (true/false) defaults to 'false'</td>
								<td><code class="literal">false</code></td>
								<td>3.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">profileSql</code></td>
								<td>Deprecated, use 'profileSQL' instead. Trace queries and
									their execution/fetch times on STDERR (true/false) defaults to
									'false'</td>
								<td><code class="literal"></code></td>
								<td>2.0.14</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">reportMetricsIntervalMillis</code></td>
								<td>If 'gatherPerfMetrics' is enabled, how often should
									they be logged (in ms)?</td>
								<td><code class="literal">30000</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">maxQuerySizeToLog</code></td>
								<td>Controls the maximum length/size of a query that will
									get logged when profiling or tracing</td>
								<td><code class="literal">2048</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">packetDebugBufferSize</code></td>
								<td>The maximum number of packets to retain when
									'enablePacketDebug' is true</td>
								<td><code class="literal">20</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">slowQueryThresholdMillis</code></td>
								<td>If 'logSlowQueries' is enabled, how long should a query
									(in ms) before it is logged as 'slow'?</td>
								<td><code class="literal">2000</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">slowQueryThresholdNanos</code></td>
								<td>If 'useNanosForElapsedTime' is set to true, and this
									property is set to a non-zero value, the driver will use this
									threshold (in nanosecond units) to determine if a query was
									slow.</td>
								<td><code class="literal">0</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useUsageAdvisor</code></td>
								<td>Should the driver issue 'usage' warnings advising
									proper and efficient usage of JDBC and MySQL Connector/J to the
									log (true/false, defaults to 'false')?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoGenerateTestcaseScript</code></td>
								<td>Should the driver dump the SQL it is executing,
									including server-side prepared statements to STDERR?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoSlowLog</code></td>
								<td>Instead of using slowQueryThreshold* to determine if a
									query is slow enough to be logged, maintain statistics that
									allow the driver to determine queries that are outside the 99th
									percentile?</td>
								<td><code class="literal">true</code></td>
								<td>5.1.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clientInfoProvider</code></td>
								<td>The name of a class that implements the
									com.mysql.jdbc.JDBC4ClientInfoProvider interface in order to
									support JDBC-4.0's Connection.get/setClientInfo() methods</td>
								<td><code class="literal">com.mysql.jdbc.JDBC4CommentClientInfoProvider</code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">dumpMetadataOnColumnNotFound</code></td>
								<td>Should the driver dump the field-level metadata of a
									result set into the exception message when
									ResultSet.findColumn() fails?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">dumpQueriesOnException</code></td>
								<td>Should the driver dump the contents of the query sent
									to the server in the message for SQLExceptions?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">enablePacketDebug</code></td>
								<td>When enabled, a ring-buffer of 'packetDebugBufferSize'
									packets will be kept, and dumped when exceptions are thrown in
									key areas in the driver's code</td>
								<td><code class="literal">false</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">explainSlowQueries</code></td>
								<td>If 'logSlowQueries' is enabled, should the driver
									automatically issue an 'EXPLAIN' on the server and send the
									results to the configured log at a WARN level?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">includeInnodbStatusInDeadlockExceptions</code></td>
								<td>Include the output of "SHOW ENGINE INNODB STATUS" in
									exception messages when deadlock exceptions are detected?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">includeThreadDumpInDeadlockExceptions</code></td>
								<td>Include a current Java thread dump in exception
									messages when deadlock exceptions are detected?</td>
								<td><code class="literal">false</code></td>
								<td>5.1.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">includeThreadNamesAsStatementComment</code></td>
								<td>Include the name of the current thread as a comment
									visible in "SHOW PROCESSLIST", or in Innodb deadlock dumps,
									useful in correlation with
									"includeInnodbStatusInDeadlockExceptions=true" and
									"includeThreadDumpInDeadlockExceptions=true".</td>
								<td><code class="literal">false</code></td>
								<td>5.1.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">logSlowQueries</code></td>
								<td>Should queries that take longer than
									'slowQueryThresholdMillis' be logged?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">logXaCommands</code></td>
								<td>Should the driver log XA commands sent by
									MysqlXaConnection to the server, at the DEBUG level of logging?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">profilerEventHandler</code></td>
								<td>Name of a class that implements the interface
									com.mysql.jdbc.profiler.ProfilerEventHandler that will be used
									to handle profiling/tracing events.</td>
								<td><code class="literal">com.mysql.jdbc.profiler.LoggingProfilerEventHandler</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">resultSetSizeThreshold</code></td>
								<td>If the usage advisor is enabled, how many rows should a
									result set contain before the driver warns that it is
									suspiciously large?</td>
								<td><code class="literal">100</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">traceProtocol</code></td>
								<td>Should trace-level network protocol be logged?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useNanosForElapsedTime</code></td>
								<td>For profiling/debugging functionality that measures
									elapsed time, should the driver try to use nanoseconds
									resolution if available (JDK &gt;= 1.5)?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.7</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					<b>Miscellaneous. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col class="cj_propstbl_prop_name">
							<col class="cj_propstbl_prop_defn">
							<col class="cj_propstbl_default">
							<col class="cj_propstbl_since_version">
						</colgroup>
						<tbody>
							<tr>
								<td scope="row"><span class="bold"><strong>
											Property Name </strong></span></td>
								<td><span class="bold"><strong> Definition
									</strong></span></td>
								<td><span class="bold"><strong> Default
											Value </strong></span></td>
								<td><span class="bold"><strong> Since
											Version </strong></span></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useUnicode</code></td>
								<td>Should the driver use Unicode character encodings when
									handling strings? Should only be used when the driver can't
									determine the character set mapping, or you are trying to
									'force' the driver to use a character set that MySQL either
									doesn't natively support (such as UTF-8), true/false, defaults
									to 'true'</td>
								<td><code class="literal">true</code></td>
								<td>1.1g</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">characterEncoding</code></td>
								<td>If 'useUnicode' is set to true, what character encoding
									should the driver use when dealing with strings? (defaults is
									to 'autodetect')</td>
								<td><code class="literal"></code></td>
								<td>1.1g</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">characterSetResults</code></td>
								<td>Character set to tell the server to return results as.</td>
								<td><code class="literal"></code></td>
								<td>3.0.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">connectionCollation</code></td>
								<td>If set, tells the server to use this collation via 'set
									collation_connection'</td>
								<td><code class="literal"></code></td>
								<td>3.0.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useBlobToStoreUTF8OutsideBMP</code></td>
								<td>Tells the driver to treat [MEDIUM/LONG]BLOB columns as
									[LONG]VARCHAR columns holding text encoded in UTF-8 that has
									characters outside the BMP (4-byte encodings), which MySQL
									server can't handle natively.</td>
								<td><code class="literal">false</code></td>
								<td>5.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">utf8OutsideBmpExcludedColumnNamePattern</code></td>
								<td>When "useBlobToStoreUTF8OutsideBMP" is set to "true",
									column names matching the given regex will still be treated as
									BLOBs unless they match the regex specified for
									"utf8OutsideBmpIncludedColumnNamePattern". The regex must
									follow the patterns used for the java.util.regex package.</td>
								<td><code class="literal"></code></td>
								<td>5.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">utf8OutsideBmpIncludedColumnNamePattern</code></td>
								<td>Used to specify exclusion rules to
									"utf8OutsideBmpExcludedColumnNamePattern". The regex must
									follow the patterns used for the java.util.regex package.</td>
								<td><code class="literal"></code></td>
								<td>5.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceEnableJMX</code></td>
								<td>Enables JMX-based management of load-balanced
									connection groups, including live addition/removal of hosts
									from load-balancing pool.</td>
								<td><code class="literal">false</code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">sessionVariables</code></td>
								<td>A comma-separated list of name/value pairs to be sent
									as SET SESSION ... to the server when the driver connects.</td>
								<td><code class="literal"></code></td>
								<td>3.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useColumnNamesInFindColumn</code></td>
								<td>Prior to JDBC-4.0, the JDBC specification had a bug
									related to what could be given as a "column name" to ResultSet
									methods like findColumn(), or getters that took a String
									property. JDBC-4.0 clarified "column name" to mean the label,
									as given in an "AS" clause and returned by
									ResultSetMetaData.getColumnLabel(), and if no AS clause, the
									column name. Setting this property to "true" will give behavior
									that is congruent to JDBC-3.0 and earlier versions of the JDBC
									specification, but which because of the specification bug could
									give unexpected results. This property is preferred over
									"useOldAliasMetadataBehavior" unless you need the specific
									behavior that it provides with respect to ResultSetMetadata.</td>
								<td><code class="literal">false</code></td>
								<td>5.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">allowNanAndInf</code></td>
								<td>Should the driver allow NaN or +/- INF values in
									PreparedStatement.setDouble()?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoClosePStmtStreams</code></td>
								<td>Should the driver automatically call .close() on
									streams/readers passed as arguments via set*() methods?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.12</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">autoDeserialize</code></td>
								<td>Should the driver automatically detect and de-serialize
									objects stored in BLOB fields?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">blobsAreStrings</code></td>
								<td>Should the driver always treat BLOBs as Strings -
									specifically to work around dubious metadata returned by the
									server for GROUP BY clauses?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">capitalizeTypeNames</code></td>
								<td>Capitalize type names in DatabaseMetaData? (usually
									only useful when using WebObjects, true/false, defaults to
									'false')</td>
								<td><code class="literal">true</code></td>
								<td>2.0.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clobCharacterEncoding</code></td>
								<td>The character encoding to use for sending and
									retrieving TEXT, MEDIUMTEXT and LONGTEXT values instead of the
									configured connection characterEncoding</td>
								<td><code class="literal"></code></td>
								<td>5.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">clobberStreamingResults</code></td>
								<td>This will cause a 'streaming' ResultSet to be
									automatically closed, and any outstanding data still streaming
									from the server to be discarded if another query is executed
									before all the data has been read from the server.</td>
								<td><code class="literal">false</code></td>
								<td>3.0.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">compensateOnDuplicateKeyUpdateCounts</code></td>
								<td>Should the driver compensate for the update counts of
									"ON DUPLICATE KEY" INSERT statements (2 = 1, 0 = 1) when using
									prepared statements?</td>
								<td><code class="literal">false</code></td>
								<td>5.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">continueBatchOnError</code></td>
								<td>Should the driver continue processing batch commands if
									one statement fails. The JDBC spec allows either way (defaults
									to 'true').</td>
								<td><code class="literal">true</code></td>
								<td>3.0.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">createDatabaseIfNotExist</code></td>
								<td>Creates the database given in the URL if it doesn't yet
									exist. Assumes the configured user has permissions to create
									databases.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">emptyStringsConvertToZero</code></td>
								<td>Should the driver allow conversions from empty string
									fields to numeric values of '0'?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">emulateLocators</code></td>
								<td>Should the driver emulate java.sql.Blobs with locators?
									With this feature enabled, the driver will delay loading the
									actual Blob data until the one of the retrieval methods
									(getInputStream(), getBytes(), and so forth) on the blob data
									stream has been accessed. For this to work, you must use a
									column alias with the value of the column to the actual name of
									the Blob. The feature also has the following restrictions: The
									SELECT that created the result set must reference only one
									table, the table must have a primary key; the SELECT must alias
									the original blob column name, specified as a string, to an
									alternate name; the SELECT must cover all columns that make up
									the primary key.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">emulateUnsupportedPstmts</code></td>
								<td>Should the driver detect prepared statements that are
									not supported by the server, and replace them with client-side
									emulated versions?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">exceptionInterceptors</code></td>
								<td>Comma-delimited list of classes that implement
									com.mysql.jdbc.ExceptionInterceptor. These classes will be
									instantiated one per Connection instance, and all SQLExceptions
									thrown by the driver will be allowed to be intercepted by these
									interceptors, in a chained fashion, with the first class listed
									as the head of the chain.</td>
								<td><code class="literal"></code></td>
								<td>5.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">functionsNeverReturnBlobs</code></td>
								<td>Should the driver always treat data from functions
									returning BLOBs as Strings - specifically to work around
									dubious metadata returned by the server for GROUP BY clauses?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">generateSimpleParameterMetadata</code></td>
								<td>Should the driver generate simplified parameter
									metadata for PreparedStatements when no metadata is available
									either because the server couldn't support preparing the
									statement, or server-side prepared statements are disabled?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">ignoreNonTxTables</code></td>
								<td>Ignore non-transactional table warning for rollback?
									(defaults to 'false').</td>
								<td><code class="literal">false</code></td>
								<td>3.0.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">jdbcCompliantTruncation</code></td>
								<td>Should the driver throw java.sql.DataTruncation
									exceptions when data is truncated as is required by the JDBC
									specification when connected to a server that supports warnings
									(MySQL 4.1.0 and newer)? This property has no effect if the
									server sql-mode includes STRICT_TRANS_TABLES.</td>
								<td><code class="literal">true</code></td>
								<td>3.1.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceAutoCommitStatementRegex</code></td>
								<td>When load-balancing is enabled for auto-commit
									statements (via loadBalanceAutoCommitStatementThreshold), the
									statement counter will only increment when the SQL matches the
									regular expression. By default, every statement issued matches.</td>
								<td><code class="literal"></code></td>
								<td>5.1.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceAutoCommitStatementThreshold</code></td>
								<td>When auto-commit is enabled, the number of statements
									which should be executed before triggering load-balancing to
									rebalance. Default value of 0 causes load-balanced connections
									to only rebalance when exceptions are encountered, or
									auto-commit is disabled and transactions are explicitly
									committed or rolled back.</td>
								<td><code class="literal">0</code></td>
								<td>5.1.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceBlacklistTimeout</code></td>
								<td>Time in milliseconds between checks of servers which
									are unavailable, by controlling how long a server lives in the
									global blacklist.</td>
								<td><code class="literal">0</code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceConnectionGroup</code></td>
								<td>Logical group of load-balanced connections within a
									classloader, used to manage different groups independently. If
									not specified, live management of load-balanced connections is
									disabled.</td>
								<td><code class="literal"></code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceExceptionChecker</code></td>
								<td>Fully-qualified class name of custom exception checker.
									The class must implement
									com.mysql.jdbc.LoadBalanceExceptionChecker interface, and is
									used to inspect SQLExceptions and determine whether they should
									trigger fail-over to another host in a load-balanced
									deployment.</td>
								<td><code class="literal">com.mysql.jdbc.StandardLoadBalanceExceptionChecker</code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalancePingTimeout</code></td>
								<td>Time in milliseconds to wait for ping response from
									each of load-balanced physical connections when using
									load-balanced Connection.</td>
								<td><code class="literal">0</code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceSQLExceptionSubclassFailover</code></td>
								<td>Comma-delimited list of classes/interfaces used by
									default load-balanced exception checker to determine whether a
									given SQLException should trigger failover. The comparison is
									done using Class.isInstance(SQLException) using the thrown
									SQLException.</td>
								<td><code class="literal"></code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceSQLStateFailover</code></td>
								<td>Comma-delimited list of SQLState codes used by default
									load-balanced exception checker to determine whether a given
									SQLException should trigger failover. The SQLState of a given
									SQLException is evaluated to determine whether it begins with
									any value in the comma-delimited list.</td>
								<td><code class="literal"></code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">loadBalanceValidateConnectionOnSwapServer</code></td>
								<td>Should the load-balanced Connection explicitly check
									whether the connection is live when swapping to a new physical
									connection at commit/rollback?</td>
								<td><code class="literal">false</code></td>
								<td>5.1.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">maxRows</code></td>
								<td>The maximum number of rows to return (0, the default
									means return all rows).</td>
								<td><code class="literal">-1</code></td>
								<td>all versions</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">netTimeoutForStreamingResults</code></td>
								<td>What value should the driver automatically set the
									server setting 'net_write_timeout' to when the streaming result
									sets feature is in use? (value has unit of seconds, the value
									'0' means the driver will not try and adjust this value)</td>
								<td><code class="literal">600</code></td>
								<td>5.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">noAccessToProcedureBodies</code></td>
								<td>When determining procedure parameter types for
									CallableStatements, and the connected user can't access
									procedure bodies through "SHOW CREATE PROCEDURE" or select on
									mysql.proc should the driver instead create basic metadata (all
									parameters reported as IN VARCHARs, but allowing
									registerOutParameter() to be called on them anyway) instead of
									throwing an exception?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">noDatetimeStringSync</code></td>
								<td>Don't ensure that
									ResultSet.getDatetimeType().toString().equals(ResultSet.getString())</td>
								<td><code class="literal">false</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">noTimezoneConversionForTimeType</code></td>
								<td>Don't convert TIME values using the server timezone if
									'useTimezone'='true'</td>
								<td><code class="literal">false</code></td>
								<td>5.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">nullCatalogMeansCurrent</code></td>
								<td>When DatabaseMetadataMethods ask for a 'catalog'
									parameter, does the value null mean use the current catalog?
									(this is not JDBC-compliant, but follows legacy behavior from
									earlier versions of the driver)</td>
								<td><code class="literal">true</code></td>
								<td>3.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">nullNamePatternMatchesAll</code></td>
								<td>Should DatabaseMetaData methods that accept *pattern
									parameters treat null the same as '%' (this is not
									JDBC-compliant, however older versions of the driver accepted
									this departure from the specification)</td>
								<td><code class="literal">true</code></td>
								<td>3.1.8</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">overrideSupportsIntegrityEnhancementFacility</code></td>
								<td>Should the driver return "true" for
									DatabaseMetaData.supportsIntegrityEnhancementFacility() even if
									the database doesn't support it to workaround applications that
									require this method to return "true" to signal support of
									foreign keys, even though the SQL specification states that
									this facility contains much more than just foreign key support
									(one such application being OpenOffice)?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.12</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">padCharsWithSpace</code></td>
								<td>If a result set column has the CHAR type and the value
									does not fill the amount of characters specified in the DDL for
									the column, should the driver pad the remaining characters with
									space (for ANSI compliance)?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">pedantic</code></td>
								<td>Follow the JDBC spec to the letter.</td>
								<td><code class="literal">false</code></td>
								<td>3.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">pinGlobalTxToPhysicalConnection</code></td>
								<td>When using XAConnections, should the driver ensure that
									operations on a given XID are always routed to the same
									physical connection? This allows the XAConnection to support
									"XA START ... JOIN" after "XA END" has been called</td>
								<td><code class="literal">false</code></td>
								<td>5.0.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">populateInsertRowWithDefaultValues</code></td>
								<td>When using ResultSets that are CONCUR_UPDATABLE, should
									the driver pre-populate the "insert" row with default values
									from the DDL for the table used in the query so those values
									are immediately available for ResultSet accessors? This
									functionality requires a call to the database for metadata each
									time a result set of this type is created. If disabled (the
									default), the default values will be populated by the an
									internal call to refreshRow() which pulls back default values
									and/or values changed by triggers.</td>
								<td><code class="literal">false</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">processEscapeCodesForPrepStmts</code></td>
								<td>Should the driver process escape codes in queries that
									are prepared?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.12</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">queryTimeoutKillsConnection</code></td>
								<td>If the timeout given in Statement.setQueryTimeout()
									expires, should the driver forcibly abort the Connection
									instead of attempting to abort the query?</td>
								<td><code class="literal">false</code></td>
								<td>5.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">relaxAutoCommit</code></td>
								<td>If the version of MySQL the driver connects to does not
									support transactions, still allow calls to commit(), rollback()
									and setAutoCommit() (true/false, defaults to 'false')?</td>
								<td><code class="literal">false</code></td>
								<td>2.0.13</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">retainStatementAfterResultSetClose</code></td>
								<td>Should the driver retain the Statement reference in a
									ResultSet after ResultSet.close() has been called. This is not
									JDBC-compliant after JDBC-4.0.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.11</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">rollbackOnPooledClose</code></td>
								<td>Should the driver issue a rollback() when the logical
									connection in a pool is closed?</td>
								<td><code class="literal">true</code></td>
								<td>3.0.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">runningCTS13</code></td>
								<td>Enables workarounds for bugs in Sun's JDBC compliance
									testsuite version 1.3</td>
								<td><code class="literal">false</code></td>
								<td>3.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">serverTimezone</code></td>
								<td>Override detection/mapping of timezone. Used when
									timezone from server doesn't map to Java timezone</td>
								<td><code class="literal"></code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">statementInterceptors</code></td>
								<td>A comma-delimited list of classes that implement
									"com.mysql.jdbc.StatementInterceptor" that should be placed "in
									between" query execution to influence the results.
									StatementInterceptors are "chainable", the results returned by
									the "current" interceptor will be passed on to the next in in
									the chain, from left-to-right order, as specified in this
									property.</td>
								<td><code class="literal"></code></td>
								<td>5.1.1</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">strictFloatingPoint</code></td>
								<td>Used only in older versions of compliance test</td>
								<td><code class="literal">false</code></td>
								<td>3.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">strictUpdates</code></td>
								<td>Should the driver do strict checking (all primary keys
									selected) of updatable result sets (true, false, defaults to
									'true')?</td>
								<td><code class="literal">true</code></td>
								<td>3.0.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tinyInt1isBit</code></td>
								<td>Should the driver treat the datatype TINYINT(1) as the
									BIT type (because the server silently converts BIT -&gt;
									TINYINT(1) when creating tables)?</td>
								<td><code class="literal">true</code></td>
								<td>3.0.16</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">transformedBitIsBoolean</code></td>
								<td>If the driver converts TINYINT(1) to a different type,
									should it use BOOLEAN instead of BIT for future compatibility
									with MySQL-5.0, as MySQL-5.0 has a BIT type?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">treatUtilDateAsTimestamp</code></td>
								<td>Should the driver treat java.util.Date as a TIMESTAMP
									for the purposes of PreparedStatement.setObject()?</td>
								<td><code class="literal">true</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">ultraDevHack</code></td>
								<td>Create PreparedStatements for prepareCall() when
									required, because UltraDev is broken and issues a prepareCall()
									for _all_ statements? (true/false, defaults to 'false')</td>
								<td><code class="literal">false</code></td>
								<td>2.0.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useAffectedRows</code></td>
								<td>Don't set the CLIENT_FOUND_ROWS flag when connecting to
									the server (not JDBC-compliant, will break most applications
									that rely on "found" rows vs. "affected rows" for DML
									statements), but does cause "correct" update counts from
									"INSERT ... ON DUPLICATE KEY UPDATE" statements to be returned
									by the server.</td>
								<td><code class="literal">false</code></td>
								<td>5.1.7</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useGmtMillisForDatetimes</code></td>
								<td>Convert between session timezone and GMT before
									creating Date and Timestamp instances (value of "false" is
									legacy behavior, "true" leads to more JDBC-compliant behavior.</td>
								<td><code class="literal">false</code></td>
								<td>3.1.12</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useHostsInPrivileges</code></td>
								<td>Add '@hostname' to users in
									DatabaseMetaData.getColumn/TablePrivileges() (true/false),
									defaults to 'true'.</td>
								<td><code class="literal">true</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useInformationSchema</code></td>
								<td>When connected to MySQL-5.0.7 or newer, should the
									driver use the INFORMATION_SCHEMA to derive information used by
									DatabaseMetaData?</td>
								<td><code class="literal">false</code></td>
								<td>5.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useJDBCCompliantTimezoneShift</code></td>
								<td>Should the driver use JDBC-compliant rules when
									converting TIME/TIMESTAMP/DATETIME values' timezone information
									for those JDBC arguments which take a java.util.Calendar
									argument? (Notice that this option is exclusive of the
									"useTimezone=true" configuration option.)</td>
								<td><code class="literal">false</code></td>
								<td>5.0.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useLegacyDatetimeCode</code></td>
								<td>Use code for DATE/TIME/DATETIME/TIMESTAMP handling in
									result sets and statements that consistently handles timezone
									conversions from client to server and back again, or use the
									legacy code for these datatypes that has been in the driver for
									backwards-compatibility?</td>
								<td><code class="literal">true</code></td>
								<td>5.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useOldAliasMetadataBehavior</code></td>
								<td>Should the driver use the legacy behavior for "AS"
									clauses on columns and tables, and only return aliases (if any)
									for ResultSetMetaData.getColumnName() or
									ResultSetMetaData.getTableName() rather than the original
									column/table name? In 5.0.x, the default value was true.</td>
								<td><code class="literal">false</code></td>
								<td>5.0.4</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useOldUTF8Behavior</code></td>
								<td>Use the UTF-8 behavior the driver did when
									communicating with 4.0 and older servers</td>
								<td><code class="literal">false</code></td>
								<td>3.1.6</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useOnlyServerErrorMessages</code></td>
								<td>Don't prepend 'standard' SQLState error messages to
									error messages returned by the server.</td>
								<td><code class="literal">true</code></td>
								<td>3.0.15</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useSSPSCompatibleTimezoneShift</code></td>
								<td>If migrating from an environment that was using
									server-side prepared statements, and the configuration property
									"useJDBCCompliantTimeZoneShift" set to "true", use compatible
									behavior when not using server-side prepared statements when
									sending TIMESTAMP values to the MySQL server.</td>
								<td><code class="literal">false</code></td>
								<td>5.0.5</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useServerPrepStmts</code></td>
								<td>Use server-side prepared statements if the server
									supports them?</td>
								<td><code class="literal">false</code></td>
								<td>3.1.0</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useSqlStateCodes</code></td>
								<td>Use SQL Standard state codes instead of 'legacy'
									X/Open/SQL state codes (true/false), default is 'true'</td>
								<td><code class="literal">true</code></td>
								<td>3.1.3</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useStreamLengthsInPrepStmts</code></td>
								<td>Honor stream length parameter in
									PreparedStatement/ResultSet.setXXXStream() method calls
									(true/false, defaults to 'true')?</td>
								<td><code class="literal">true</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useTimezone</code></td>
								<td>Convert time/date types between client and server
									timezones (true/false, defaults to 'false')?</td>
								<td><code class="literal">false</code></td>
								<td>3.0.2</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">useUnbufferedInput</code></td>
								<td>Don't use BufferedInputStream for reading data from the
									server</td>
								<td><code class="literal">true</code></td>
								<td>3.0.11</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">yearIsDateType</code></td>
								<td>Should the JDBC driver treat the MySQL type "YEAR" as a
									java.sql.Date, or as a SHORT?</td>
								<td><code class="literal">true</code></td>
								<td>3.1.9</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">zeroDateTimeBehavior</code></td>
								<td>What should happen when the driver encounters DATETIME
									values that are composed entirely of zeros (used by MySQL to
									represent invalid dates)? Valid values are "exception", "round"
									and "convertToNull".</td>
								<td><code class="literal">exception</code></td>
								<td>3.1.4</td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<p>
					Connector/J also supports access to MySQL using named pipes on
					Windows NT, Windows 2000, or Windows XP using the
					<code class="literal">NamedPipeSocketFactory</code>
					as a plugin-socket factory using the
					<code class="literal">socketFactory</code>
					property. If you do not use a
					<code class="literal">namedPipePath</code>
					property, the default of
					<code class="literal">'\\.\pipe\MySQL'</code>
					is used. If you use the
					<code class="literal">NamedPipeSocketFactory</code>
					, the host name and port number values in the JDBC url are ignored.
					To enable this feature, use:
				</p>
				<pre class="programlisting">socketFactory=com.mysql.jdbc.NamedPipeSocketFactory</pre>
				<p>Named pipes only work when connecting to a MySQL server on
					the same physical machine where the JDBC driver is running. In
					simple performance tests, named pipe access is between 30%-50%
					faster than the standard TCP/IP access. However, this varies per
					system, and named pipes are slower than TCP/IP in many Windows
					configurations.</p>
				<p>
					To create your own socket factories, follow the example code in
					<code class="classname">com.mysql.jdbc.NamedPipeSocketFactory</code>
					, or
					<code class="classname">com.mysql.jdbc.StandardSocketFactory</code>
					.
				</p>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="connector-j-useconfigs"></a>5.1.1. Properties Files
									for the
									<code class="literal">useConfigs</code>
									Option
								</h3>
							</div>
						</div>
					</div>
					<a class="indexterm" name="id558966"></a>
					<p>
						The
						<code class="literal">useConfigs</code>
						connection option is a convenient shorthand for specifying
						combinations of options for particular scenarios. The argument
						values you can use with this option correspond to the names of
						<code class="filename">.properties</code>
						files within the Connector/J
						<code class="filename">
							mysql-connector-java-<em class="replaceable"><code>version</code></em>-bin.jar
						</code>
						JAR file. For example, the Connector/J 5.1.9 driver includes the
						following configuration properties files:
					</p>
					<pre class="programlisting">$ unzip mysql-connector-java-5.1.19-bin.jar '*/configs/*'
Archive:  mysql-connector-java-5.1.19-bin.jar
   creating: com/mysql/jdbc/configs/
  inflating: com/mysql/jdbc/configs/3-0-Compat.properties  
  inflating: com/mysql/jdbc/configs/5-0-Compat.properties  
  inflating: com/mysql/jdbc/configs/clusterBase.properties  
  inflating: com/mysql/jdbc/configs/coldFusion.properties  
  inflating: com/mysql/jdbc/configs/fullDebug.properties  
  inflating: com/mysql/jdbc/configs/maxPerformance.properties  
  inflating: com/mysql/jdbc/configs/solarisMaxPerformance.properties </pre>
					<p>
						To specify one of these combinations of options, specify
						<code class="literal">useConfigs=3-0-Compat</code>
						,
						<code class="literal">useConfigs=maxPerformance</code>
						, and so on. The following sections show the options that are part
						of each
						<code class="literal">useConfigs</code>
						setting. For the details of why each one is included, see the
						comments in the
						<code class="filename">.properties</code>
						files.
					</p>
					<h4>
						<a name="id559043"></a> 3-0-Compat
					</h4>
					<pre class="programlisting">emptyStringsConvertToZero=true
jdbcCompliantTruncation=false
noDatetimeStringSync=true
nullCatalogMeansCurrent=true
nullNamePatternMatchesAll=true
transformedBitIsBoolean=false
dontTrackOpenResources=true
zeroDateTimeBehavior=convertToNull
useServerPrepStmts=false
autoClosePStmtStreams=true
processEscapeCodesForPrepStmts=false
useFastDateParsing=false
populateInsertRowWithDefaultValues=false
useDirectRowUnpack=false</pre>
					<h4>
						<a name="id559056"></a> 5-0-Compat
					</h4>
					<pre class="programlisting">useDirectRowUnpack=false</pre>
					<h4>
						<a name="id559065"></a> clusterBase
					</h4>
					<pre class="programlisting">autoReconnect=true
failOverReadOnly=false
roundRobinLoadBalance=true</pre>
					<h4>
						<a name="id559075"></a> coldFusion
					</h4>
					<pre class="programlisting">useDynamicCharsetInfo=false
alwaysSendSetIsolation=false
useLocalSessionState=true
autoReconnect=true</pre>
					<h4>
						<a name="id559085"></a> fullDebug
					</h4>
					<pre class="programlisting">profileSQL=true
gatherPerMetrics=true
useUsageAdvisor=true
logSlowQueries=true
explainSlowQueries=true</pre>
					<h4>
						<a name="id559095"></a> maxPerformance
					</h4>
					<pre class="programlisting">cachePrepStmts=true
cacheCallableStmts=true
cacheServerConfiguration=true
useLocalSessionState=true
elideSetAutoCommits=true
alwaysSendSetIsolation=false
enableQueryTimeouts=false</pre>
					<h4>
						<a name="id559106"></a> solarisMaxPerformance
					</h4>
					<pre class="programlisting">useUnbufferedInput=false
useReadAheadInput=false
maintainTimeStats=false</pre>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-implementation-notes"></a>5.2. JDBC
								API Implementation Notes
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id559126"></a>
				<p>MySQL Connector/J passes all of the tests in the publicly
					available version of Sun's JDBC compliance test suite. This section
					gives details on a interface-by-interface level about
					implementation decisions that might affect how you code
					applications with MySQL Connector/J. The JDBC specification is
					vague about how certain functionality should be implemented, or the
					specification enables leeway in implementation.</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								<span class="bold"><strong>BLOB</strong></span>
							</p>
							<p>
								Starting with Connector/J version 3.1.0, you can emulate BLOBs
								with locators by adding the property
								<code class="literal">emulateLocators=true</code>
								to your JDBC URL. Using this method, the driver will delay
								loading the actual BLOB data until you retrieve the other data
								and then use retrieval methods (
								<code class="function">getInputStream()</code>
								,
								<code class="function">getBytes()</code>
								, and so forth) on the BLOB data stream.
							</p>
							<p>You must use a column alias with the value of the column
								to the actual name of the BLOB, for example:</p>
							<pre class="programlisting">SELECT id, 'data' as blob_data from blobtable</pre>
							<p>You must also follow these rules:</p>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>
											The <a class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
												target="_top"><code class="literal">SELECT</code></a> must
											reference only one table. The table must have a <a
												class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_primary_key"
												target="_top">primary key</a>.
										</p></li>
									<li class="listitem"><p>
											The <a class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
												target="_top"><code class="literal">SELECT</code></a> must
											alias the original BLOB column name, specified as a string,
											to an alternate name.
										</p></li>
									<li class="listitem"><p>
											The <a class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
												target="_top"><code class="literal">SELECT</code></a> must
											cover all columns that make up the primary key.
										</p></li>
								</ul>
							</div>
							<p>
								The BLOB implementation does not allow in-place modification
								(they are copies, as reported by the
								<code class="literal">DatabaseMetaData.locatorsUpdateCopies()</code>
								method). Because of this, use the corresponding
								<code class="literal">PreparedStatement.setBlob()</code>
								or
								<code class="literal">ResultSet.updateBlob()</code>
								(in the case of updatable result sets) methods to save changes
								back to the database.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>CallableStatement</strong></span>
							</p>
							<p>
								Starting with Connector/J 3.1.1, stored procedures are supported
								when connecting to MySQL version 5.0 or newer using the
								<code class="classname">CallableStatement</code>
								interface. Currently, the
								<code class="function">getParameterMetaData()</code>
								method of
								<code class="classname">CallableStatement</code>
								is not supported.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>CLOB</strong></span>
							</p>
							<p>
								The CLOB implementation does not allow in-place modification
								(they are copies, as reported by the
								<code class="literal">DatabaseMetaData.locatorsUpdateCopies()</code>
								method). Because of this, use the
								<code class="literal">PreparedStatement.setClob()</code>
								method to save changes back to the database. The JDBC API does
								not have a
								<code class="literal">ResultSet.updateClob()</code>
								method.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>Connection</strong></span>
							</p>
							<p>
								Unlike the pre-Connector/J JDBC driver (
								<code class="literal">MM.MySQL</code>
								), the
								<code class="function">isClosed()</code>
								method does not ping the server to determine if it is available.
								In accordance with the JDBC specification, it only returns true
								if
								<code class="function">closed()</code>
								has been called on the connection. If you need to determine if
								the connection is still valid, issue a simple query, such as
								<code class="literal">SELECT 1</code>
								. The driver will throw an exception if the connection is no
								longer valid.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>DatabaseMetaData</strong></span>
							</p>
							<p>
								<a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_foreign_key"
									target="_top">Foreign key</a> information (
								<code class="function">getImportedKeys()</code>
								/
								<code class="function">getExportedKeys()</code>
								and
								<code class="function">getCrossReference()</code>
								) is only available from <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/innodb-storage-engine.html"
									target="_top"><code class="literal">InnoDB</code></a> tables.
								The driver uses <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/show-create-table.html"
									target="_top"><code class="literal">SHOW CREATE
										TABLE</code></a> to retrieve this information, so if any other storage
								engines add support for foreign keys, the driver would
								transparently support them as well.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>PreparedStatement</strong></span>
							</p>
							<p>
								PreparedStatements are implemented by the driver, as MySQL does
								not have a prepared statement feature. Because of this, the
								driver does not implement
								<code class="function">getParameterMetaData()</code>
								or
								<code class="function">getMetaData()</code>
								as it would require the driver to have a complete SQL parser in
								the client.
							</p>
							<p>Starting with version 3.1.0 MySQL Connector/J, server-side
								prepared statements and binary-encoded result sets are used when
								the server supports them.</p>
							<p>
								Take care when using a server-side prepared statement with <span
									class="bold"><strong>large</strong></span> parameters that are
								set using
								<code class="function">setBinaryStream()</code>
								,
								<code class="function">setAsciiStream()</code>
								,
								<code class="function">setUnicodeStream()</code>
								,
								<code class="function">setBlob()</code>
								, or
								<code class="function">setClob()</code>
								. To re-execute the statement with any large parameter changed
								to a nonlarge parameter, call
								<code class="function">clearParameters()</code>
								and set all parameters again. The reason for this is as follows:
							</p>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>
											During both server-side prepared statements and client-side
											emulation, large data is exchanged only when
											<code class="literal">PreparedStatement.execute()</code>
											is called.
										</p></li>
								</ul>
							</div>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>Once that has been done, the
											stream used to read the data on the client side is closed (as
											per the JDBC spec), and cannot be read from again.</p></li>
								</ul>
							</div>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>
											If a parameter changes from large to nonlarge, the driver
											must reset the server-side state of the prepared statement to
											allow the parameter that is being changed to take the place
											of the prior large value. This removes all of the large data
											that has already been sent to the server, thus requiring the
											data to be re-sent, using the
											<code class="function">setBinaryStream()</code>
											,
											<code class="function">setAsciiStream()</code>
											,
											<code class="function">setUnicodeStream()</code>
											,
											<code class="function">setBlob()</code>
											or
											<code class="function">setClob()</code>
											method.
										</p></li>
								</ul>
							</div>
							<p>
								Consequently, to change the type of a parameter to a nonlarge
								one, you must call
								<code class="function">clearParameters()</code>
								and set all parameters of the prepared statement again before it
								can be re-executed.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>ResultSet</strong></span>
							</p>
							<p>By default, ResultSets are completely retrieved and stored
								in memory. In most cases this is the most efficient way to
								operate, and due to the design of the MySQL network protocol is
								easier to implement. If you are working with ResultSets that
								have a large number of rows or large values, and cannot allocate
								heap space in your JVM for the memory required, you can tell the
								driver to stream the results back one row at a time.</p>
							<p>
								To enable this functionality, create a
								<code class="literal">Statement</code>
								instance in the following manner:
							</p>
							<pre class="programlisting">stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);</pre>
							<p>
								The combination of a forward-only, read-only result set, with a
								fetch size of
								<code class="literal">Integer.MIN_VALUE</code>
								serves as a signal to the driver to stream result sets
								row-by-row. After this, any result sets created with the
								statement will be retrieved row-by-row.
							</p>
							<p>There are some caveats with this approach. You must read
								all of the rows in the result set (or close it) before you can
								issue any other queries on the connection, or an exception will
								be thrown.</p>
							<p>
								The earliest the locks these statements hold can be released
								(whether they be
								<code class="literal">MyISAM</code>
								table-level locks or row-level locks in some other storage
								engine such as
								<code class="literal">InnoDB</code>
								) is when the statement completes.
							</p>
							<p>If the statement is within scope of a transaction, then
								locks are released when the transaction completes (which implies
								that the statement needs to complete first). As with most other
								databases, statements are not complete until all the results
								pending on the statement are read or the active result set for
								the statement is closed.</p>
							<p>Therefore, if using streaming results, process them as
								quickly as possible if you want to maintain concurrent access to
								the tables referenced by the statement producing the result set.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>ResultSetMetaData</strong></span>
							</p>
							<p>
								The
								<code class="function">isAutoIncrement()</code>
								method only works when using MySQL servers 4.0 and newer.
							</p></li>
						<li class="listitem"><p>
								<span class="bold"><strong>Statement</strong></span>
							</p>
							<p>
								When using versions of the JDBC driver earlier than 3.2.1, and
								connected to server versions earlier than 5.0.3, the
								<code class="function">setFetchSize()</code>
								method has no effect, other than to toggle result set streaming
								as described above.
							</p>
							<p>
								Connector/J 5.0.0 and later include support for both
								<code class="literal">Statement.cancel()</code>
								and
								<code class="literal">Statement.setQueryTimeout()</code>
								. Both require MySQL 5.0.0 or newer server, and require a
								separate connection to issue the <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/kill.html"
									target="_top"><code class="literal">KILL QUERY</code></a>
								statement. In the case of
								<code class="function">setQueryTimeout()</code>
								, the implementation creates an additional thread to handle the
								timeout functionality.
							</p>
							<div xmlns="http://www.w3.org/1999/xhtml" class="note"
								style="margin-left: 0.5in; margin-right: 0.5in;">
								<div class="admon-title">Note</div>
								<p xmlns="">
									Failures to cancel the statement for
									<code class="function">setQueryTimeout()</code>
									may manifest themselves as
									<code class="literal">RuntimeException</code>
									rather than failing silently, as there is currently no way to
									unblock the thread that is executing the query being cancelled
									due to timeout expiration and have it throw the exception
									instead.
								</p>
							</div>
							<div xmlns="http://www.w3.org/1999/xhtml" class="note"
								style="margin-left: 0.5in; margin-right: 0.5in;">
								<div class="admon-title">Note</div>
								<p xmlns="">
									The MySQL statement <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/kill.html"
										target="_top"><code class="literal">KILL QUERY</code></a>
									(which is what the driver uses to implement
									<code class="literal">Statement.cancel()</code>
									) is non-deterministic; thus, avoid the use of
									<code class="literal">Statement.cancel()</code>
									if possible. If no query is in process, the next query issued
									will be killed by the server. This race condition is guarded
									against as of Connector/J 5.1.18.
								</p>
							</div>
							<p>
								MySQL does not support SQL cursors, and the JDBC driver doesn't
								emulate them, so
								<code class="literal">setCursorName()</code>
								has no effect.
							</p>
							<p>Connector/J 5.1.3 and later include two additional
								methods:</p>
							<div class="itemizedlist">
								<ul class="itemizedlist" style="list-style-type: circle;">
									<li class="listitem"><p>
											<code class="function">setLocalInfileInputStream()</code>
											sets an
											<code class="literal">InputStream</code>
											instance that will be used to send data to the MySQL server
											for a <a class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
												target="_top"><code class="literal">LOAD DATA
													LOCAL INFILE</code></a> statement rather than a
											<code class="literal">FileInputStream</code>
											or
											<code class="literal">URLInputStream</code>
											that represents the path given as an argument to the
											statement.
										</p>
										<p>
											This stream will be read to completion upon execution of a <a
												class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
												target="_top"><code class="literal">LOAD DATA
													LOCAL INFILE</code></a> statement, and will automatically be closed by
											the driver, so it needs to be reset before each call to
											<code class="literal">execute*()</code>
											that would cause the MySQL server to request data to fulfill
											the request for <a class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
												target="_top"><code class="literal">LOAD DATA
													LOCAL INFILE</code></a>.
										</p>
										<p>
											If this value is set to
											<code class="literal">NULL</code>
											, the driver will revert to using a
											<code class="literal">FileInputStream</code>
											or
											<code class="literal">URLInputStream</code>
											as required.
										</p></li>
									<li class="listitem"><p>
											<code class="function">getLocalInfileInputStream()</code>
											returns the
											<code class="literal">InputStream</code>
											instance that will be used to send data in response to a <a
												class="ulink"
												href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
												target="_top"><code class="literal">LOAD DATA
													LOCAL INFILE</code></a> statement.
										</p>
										<p>
											This method returns
											<code class="literal">NULL</code>
											if no such stream has been set using
											<code class="function">setLocalInfileInputStream()</code>
											.
										</p></li>
								</ul>
							</div></li>
					</ul>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-type-conversions"></a>5.3. Java,
								JDBC and MySQL Types
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id559979"></a>
				<p>MySQL Connector/J is flexible in the way it handles
					conversions between MySQL data types and Java data types.</p>
				<p>
					In general, any MySQL data type can be converted to a
					<code class="literal">java.lang.String</code>
					, and any numeric type can be converted to any of the Java numeric
					types, although round-off, overflow, or loss of precision may
					occur.
				</p>
				<div xmlns="http://www.w3.org/1999/xhtml" class="note"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Note</div>
					<p xmlns="">
						All
						<code class="literal">TEXT</code>
						types return
						<code class="literal">Types.LONGVARCHAR</code>
						with different
						<code class="literal">getPrecision()</code>
						values (65535, 255, 16777215, and 2147483647 respectively) with
						<code class="literal">getColumnType()</code>
						returning
						<code class="literal">-1</code>
						. This behavior is intentional even though
						<code class="literal">TINYTEXT</code>
						does not fall, regarding to its size, within the
						<code class="literal">LONGVARCHAR</code>
						category. This is to avoid different handling inside the same base
						type. And
						<code class="literal">getColumnType()</code>
						returns
						<code class="literal">-1</code>
						because the internal server handling is of type
						<code class="literal">TEXT</code>
						, which is similar to
						<code class="literal">BLOB</code>
						.
					</p>
					<p xmlns="">
						Also note that
						<code class="literal">getColumnTypeName()</code>
						will return
						<code class="literal">VARCHAR</code>
						even though
						<code class="literal">getColumnType()</code>
						returns
						<code class="literal">Types.LONGVARCHAR</code>
						, because
						<code class="literal">VARCHAR</code>
						is the designated column database-specific name for this type.
					</p>
				</div>
				<p>
					Starting with Connector/J 3.1.0, the JDBC driver issues warnings or
					throws
					<code class="literal">DataTruncation</code>
					exceptions as is required by the JDBC specification unless the
					connection was configured not to do so by using the property
					<code class="literal">jdbcCompliantTruncation</code>
					and setting it to
					<code class="literal">false</code>
					.
				</p>
				<p>The conversions that are always guaranteed to work are listed
					in the following table:</p>
				<p>
					<b>Connection Properties - Miscellaneous. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th scope="col">These MySQL Data Types</th>
								<th scope="col">Can always be converted to these Java types</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td scope="row"><code class="literal">CHAR, VARCHAR,
										BLOB, TEXT, ENUM, and SET</code></td>
								<td><code class="literal">java.lang.String,
										java.io.InputStream, java.io.Reader, java.sql.Blob,
										java.sql.Clob</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">FLOAT, REAL,
										DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT,
										MEDIUMINT, INTEGER, BIGINT</code></td>
								<td><code class="literal">java.lang.String,
										java.lang.Short, java.lang.Integer, java.lang.Long,
										java.lang.Double, java.math.BigDecimal</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">DATE, TIME,
										DATETIME, TIMESTAMP</code></td>
								<td><code class="literal">java.lang.String,
										java.sql.Date, java.sql.Timestamp</code></td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<div xmlns="http://www.w3.org/1999/xhtml" class="note"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Note</div>
					<p xmlns="">Round-off, overflow or loss of precision may occur
						if you choose a Java numeric data type that has less precision or
						capacity than the MySQL data type you are converting to/from.</p>
				</div>
				<p>
					The
					<code class="classname">ResultSet.getObject()</code>
					method uses the type conversions between MySQL and Java types,
					following the JDBC specification where appropriate. The value
					returned by
					<code class="classname">ResultSetMetaData.GetColumnClassName()</code>
					is also shown below. For more information on the
					<code class="literal">java.sql.Types</code>
					classes see <a class="ulink"
						href="http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Types.html"
						target="_top">Java 2 Platform Types</a>.
				</p>
				<p>
					<b>MySQL Types to Java Types for ResultSet.getObject(). </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th scope="col">MySQL Type Name</th>
								<th scope="col">Return value of <code class="literal">GetColumnClassName</code></th>
								<th scope="col">Returned as Java Class</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td scope="row"><code class="literal">BIT(1)</code> (new in
									MySQL-5.0)</td>
								<td><code class="literal">BIT</code></td>
								<td><code class="classname">java.lang.Boolean</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">BIT( &gt; 1)</code>
									(new in MySQL-5.0)</td>
								<td><code class="literal">BIT</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TINYINT</code></td>
								<td><code class="literal">TINYINT</code></td>
								<td><code class="classname">java.lang.Boolean</code> if the
									configuration property <code class="literal">tinyInt1isBit</code>
									is set to <code class="literal">true</code> (the default) and
									the storage size is 1, or <code class="classname">java.lang.Integer</code>
									if not.</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">BOOL</code>, <code
										class="literal">BOOLEAN</code></td>
								<td><code class="literal">TINYINT</code></td>
								<td>See <code class="literal">TINYINT</code>, above as
									these are aliases for <code class="literal">TINYINT(1)</code>,
									currently.
								</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">SMALLINT[(M)]
										[UNSIGNED]</code></td>
								<td><code class="literal">SMALLINT [UNSIGNED]</code></td>
								<td><code class="classname">java.lang.Integer</code>
									(regardless if <code class="literal">UNSIGNED</code> or not)</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">MEDIUMINT[(M)]
										[UNSIGNED]</code></td>
								<td><code class="literal">MEDIUMINT [UNSIGNED]</code></td>
								<td><code class="classname">java.lang.Integer,</code> if <code
										class="literal">UNSIGNED</code> <code class="classname">java.lang.Long</code>
									(C/J 3.1 and earlier), or <code class="classname">java.lang.Integer</code>
									for C/J 5.0 and later</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">INT,INTEGER[(M)]
										[UNSIGNED]</code></td>
								<td><code class="literal">INTEGER [UNSIGNED]</code></td>
								<td><code class="classname">java.lang.Integer</code>, if <code
										class="literal">UNSIGNED</code> <code class="classname">java.lang.Long</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">BIGINT[(M)]
										[UNSIGNED]</code></td>
								<td><code class="literal">BIGINT [UNSIGNED]</code></td>
								<td><code class="classname">java.lang.Long</code>, if
									UNSIGNED <code class="classname">java.math.BigInteger</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">FLOAT[(M,D)]</code></td>
								<td><code class="literal">FLOAT</code></td>
								<td><code class="classname">java.lang.Float</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">DOUBLE[(M,B)]</code></td>
								<td><code class="literal">DOUBLE</code></td>
								<td><code class="classname">java.lang.Double</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">DECIMAL[(M[,D])]</code></td>
								<td><code class="literal">DECIMAL</code></td>
								<td><code class="classname">java.math.BigDecimal</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">DATE</code></td>
								<td><code class="literal">DATE</code></td>
								<td><code class="classname">java.sql.Date</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">DATETIME</code></td>
								<td><code class="literal">DATETIME</code></td>
								<td><code class="classname">java.sql.Timestamp</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TIMESTAMP[(M)]</code></td>
								<td><code class="literal">TIMESTAMP</code></td>
								<td><code class="classname">java.sql.Timestamp</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TIME</code></td>
								<td><code class="literal">TIME</code></td>
								<td><code class="classname">java.sql.Time</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">YEAR[(2|4)]</code></td>
								<td><code class="literal">YEAR</code></td>
								<td>If <code class="literal">yearIsDateType</code>
									configuration property is set to <code class="literal">false</code>,
									then the returned object type is <code class="classname">java.sql.Short</code>.
									If set to <code class="literal">true</code> (the default), then
									the returned object is of type <code class="classname">java.sql.Date</code>
									with the date set to January 1st, at midnight.
								</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">CHAR(M)</code></td>
								<td><code class="literal">CHAR</code></td>
								<td><code class="classname">java.lang.String</code> (unless
									the character set for the column is <code class="literal">BINARY</code>,
									then <code class="classname">byte[]</code> is returned.</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">VARCHAR(M)
										[BINARY]</code></td>
								<td><code class="literal">VARCHAR</code></td>
								<td><code class="classname">java.lang.String</code> (unless
									the character set for the column is <code class="literal">BINARY</code>,
									then <code class="classname">byte[]</code> is returned.</td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">BINARY(M)</code></td>
								<td><code class="literal">BINARY</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">VARBINARY(M)</code></td>
								<td><code class="literal">VARBINARY</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TINYBLOB</code></td>
								<td><code class="literal">TINYBLOB</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TINYTEXT</code></td>
								<td><code class="literal">VARCHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">BLOB</code></td>
								<td><code class="literal">BLOB</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">TEXT</code></td>
								<td><code class="literal">VARCHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">MEDIUMBLOB</code></td>
								<td><code class="literal">MEDIUMBLOB</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">MEDIUMTEXT</code></td>
								<td><code class="literal">VARCHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">LONGBLOB</code></td>
								<td><code class="literal">LONGBLOB</code></td>
								<td><code class="classname">byte[]</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">LONGTEXT</code></td>
								<td><code class="literal">VARCHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">ENUM('value1','value2',...)</code></td>
								<td><code class="literal">CHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">SET('value1','value2',...)</code></td>
								<td><code class="literal">CHAR</code></td>
								<td><code class="classname">java.lang.String</code></td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-charsets"></a>5.4. Using
								Character Sets and Unicode
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id561106"></a><a class="indexterm"
					name="id561118"></a><a class="indexterm" name="id561131"></a>
				<p>
					All strings sent from the JDBC driver to the server are converted
					automatically from native Java Unicode form to the client character
					encoding, including all queries sent using
					<code class="literal">Statement.execute()</code>
					,
					<code class="literal">Statement.executeUpdate()</code>
					,
					<code class="literal">Statement.executeQuery()</code>
					as well as all
					<code class="interfacename">PreparedStatement</code>
					and
					<code class="interfacename">CallableStatement</code>
					parameters with the exclusion of parameters set using
					<code class="function">setBytes()</code>
					,
					<code class="function">setBinaryStream()</code>
					,
					<code class="function">setAsciiStream()</code>
					,
					<code class="function">setUnicodeStream()</code>
					and
					<code class="function">setBlob()</code>
					.
				</p>
				<h3>
					<a name="id561204"></a> Number of Encodings Per Connection
				</h3>
				<p>
					In MySQL Server 4.1 and higher, Connector/J supports a single
					character encoding between client and server, and any number of
					character encodings for data returned by the server to the client
					in
					<code class="classname">ResultSets</code>
					.
				</p>
				<p>
					Prior to MySQL Server 4.1, Connector/J supported a single character
					encoding per connection, which could either be automatically
					detected from the server configuration, or could be configured by
					the user through the <em class="parameter"><code>useUnicode</code></em>
					and <em class="parameter"><code>characterEncoding</code></em>
					properties.
				</p>
				<h3>
					<a name="id561235"></a> Setting the Character Encoding
				</h3>
				<p>
					The character encoding between client and server is automatically
					detected upon connection. You specify the encoding on the server
					using the <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_character_set_server"
						target="_top"><code class="literal">character_set_server</code></a>
					for server versions 4.1.0 and newer, and
					<code class="literal">character_set</code>
					system variable for server versions older than 4.1.0. The driver
					automatically uses the encoding specified by the server. For more
					information, see <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/charset-server.html"
						target="_top">Server Character Set and Collation</a>.
				</p>
				<p>
					For example, to use 4-byte UTF-8 character sets with Connector/J,
					configure the MySQL server with <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_character_set_server"
						target="_top"><code class="literal">character_set_server=utf8mb4</code></a>,
					and leave
					<code class="literal">characterEncoding</code>
					out of the Connector/J connection string. Connector/J will then
					autodetect the UTF-8 setting.
				</p>
				<p>
					To override the automatically detected encoding on the client side,
					use the <em class="parameter"><code>characterEncoding</code></em>
					property in the URL used to connect to the server.
				</p>
				<p>
					To allow multiple character sets to be sent from the client, use
					the UTF-8 encoding, either by configuring
					<code class="literal">utf8</code>
					as the default server character set, or by configuring the JDBC
					driver to use UTF-8 through the
					<code class="literal">characterEncoding</code>
					property.
				</p>
				<p>When specifying character encodings on the client side, use
					Java-style names. The following table lists Java-style names for
					MySQL character sets:</p>
				<p>
					<b>MySQL to Java Encoding Name Translations. </b>
				</p>
				<div class="informaltable">
					<table border="1">
						<colgroup>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th scope="col">MySQL Character Set Name</th>
								<th scope="col">Java-Style Character Encoding Name</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td scope="row"><code class="literal">ascii</code></td>
								<td><code class="literal">US-ASCII</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">big5</code></td>
								<td><code class="literal">Big5</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">gbk</code></td>
								<td><code class="literal">GBK</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">sjis</code></td>
								<td><code class="literal">SJIS (or Cp932 or MS932
										for MySQL Server &lt; 4.1.11)</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cp932</code></td>
								<td><code class="literal">Cp932 or MS932 (MySQL
										Server &gt; 4.1.11)</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">gb2312</code></td>
								<td><code class="literal">EUC_CN</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">ujis</code></td>
								<td><code class="literal">EUC_JP</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">euckr</code></td>
								<td><code class="literal">EUC_KR</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">latin1</code></td>
								<td><code class="literal">Cp1252</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">latin2</code></td>
								<td><code class="literal">ISO8859_2</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">greek</code></td>
								<td><code class="literal">ISO8859_7</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">hebrew</code></td>
								<td><code class="literal">ISO8859_8</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cp866</code></td>
								<td><code class="literal">Cp866</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">tis620</code></td>
								<td><code class="literal">TIS620</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cp1250</code></td>
								<td><code class="literal">Cp1250</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cp1251</code></td>
								<td><code class="literal">Cp1251</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">cp1257</code></td>
								<td><code class="literal">Cp1257</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">macroman</code></td>
								<td><code class="literal">MacRoman</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">macce</code></td>
								<td><code class="literal">MacCentralEurope</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">utf8</code></td>
								<td><code class="literal">UTF-8</code></td>
							</tr>
							<tr>
								<td scope="row"><code class="literal">ucs2</code></td>
								<td><code class="literal">UnicodeBig</code></td>
							</tr>
						</tbody>
					</table>
				</div>
				<p></p>
				<div xmlns="http://www.w3.org/1999/xhtml" class="warning"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Warning</div>
					<p xmlns="">
						Do not issue the query
						<code class="literal">set names</code>
						with Connector/J, as the driver will not detect that the character
						set has changed, and will continue to use the character set
						detected during the initial connection setup.
					</p>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-using-ssl"></a>5.5. Connecting
								Securely Using SSL
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id561737"></a>
				<p>SSL in MySQL Connector/J encrypts all data (other than the
					initial handshake) between the JDBC driver and the server. The
					performance penalty for enabling SSL is an increase in query
					processing time between 35% and 50%, depending on the size of the
					query, and the amount of data it returns.</p>
				<p>For SSL support to work, you must have the following:</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								A JDK that includes JSSE (Java Secure Sockets Extension), like
								JDK-1.4.1 or newer. SSL does not currently work with a JDK that
								you can add JSSE to, like JDK-1.2.x or JDK-1.3.x due to the
								following JSSE bug: <a class="ulink"
									href="http://developer.java.sun.com/developer/bugParade/bugs/4273544.html"
									target="_top">http://developer.java.sun.com/developer/bugParade/bugs/4273544.html</a>
							</p></li>
						<li class="listitem"><p>
								A MySQL server that supports SSL and has been compiled and
								configured to do so, which is MySQL 4.0.4 or later. For more
								information, see <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/configuring-for-ssl.html"
									target="_top">Configuring MySQL for SSL</a>.
							</p></li>
						<li class="listitem"><p>A client certificate (covered
								later in this section)</p></li>
					</ul>
				</div>
				<p>
					The system works through two Java truststore files, one file
					contains the certificate information for the server (
					<code class="filename">truststore</code>
					in the examples below). The other file contains the certificate for
					the client (
					<code class="filename">keystore</code>
					in the examples below). All Java truststore files are password
					protected by supplying a suitable password to the <span
						class="command"><strong>keytool</strong></span> when you create
					the files. You need the file names and associated passwords to
					create an SSL connection.
				</p>
				<p>
					You will first need to import the MySQL server CA Certificate into
					a Java truststore. A sample MySQL server CA Certificate is located
					in the
					<code class="filename">SSL</code>
					subdirectory of the MySQL source distribution. This is what SSL
					will use to determine if you are communicating with a secure MySQL
					server. Alternatively, use the CA Certificate that you have
					generated or been provided with by your SSL provider.
				</p>
				<p>
					To use Java's <span class="command"><strong>keytool</strong></span>
					to create a truststore in the current directory , and import the
					server's CA certificate (
					<code class="filename">cacert.pem</code>
					), you can do the following (assuming that <span class="command"><strong>keytool</strong></span>
					is in your path. The <span class="command"><strong>keytool</strong></span>
					is typically located in the
					<code class="filename">bin</code>
					subdirectory of your JDK or JRE):
				</p>
				<pre class="programlisting">shell&gt; keytool -import -alias mysqlServerCACert \
						-file cacert.pem -keystore truststore</pre>
				<p>
					Enter the password when prompted for the keystore file. Interaction
					with <span class="command"><strong>keytool</strong></span> looks
					like this:
				</p>
				<pre class="programlisting">Enter keystore password:  *********
Owner: EMAILADDRESS=walrus@example.com, CN=Walrus,
       O=MySQL AB, L=Orenburg, ST=Some-State, C=RU
Issuer: EMAILADDRESS=walrus@example.com, CN=Walrus,
       O=MySQL AB, L=Orenburg, ST=Some-State, C=RU
Serial number: 0
Valid from:
   Fri Aug 02 16:55:53 CDT 2002 until: Sat Aug 02 16:55:53 CDT 2003
Certificate fingerprints:
    MD5:  61:91:A0:F2:03:07:61:7A:81:38:66:DA:19:C4:8D:AB
    SHA1: 25:77:41:05:D5:AD:99:8C:14:8C:CA:68:9C:2F:B8:89:C3:34:4D:6C
Trust this certificate? [no]:  yes
Certificate was added to keystore</pre>
				<p>You then have two options: either import the client
					certificate that matches the CA certificate you just imported, or
					create a new client certificate.</p>
				<p>
					Importing an existing certificate requires the certificate to be in
					DER format. You can use <span class="command"><strong>openssl</strong></span>
					to convert an existing certificate into the new format. For
					example:
				</p>
				<pre class="programlisting">shell&gt; openssl x509 -outform DER -in client-cert.pem -out client.cert</pre>
				<p>
					Now import the converted certificate into your keystore using <span
						class="command"><strong>keytool</strong></span>:
				</p>
				<pre class="programlisting">shell&gt; keytool -import -file client.cert -keystore keystore -alias mysqlClientCertificate</pre>
				<p>
					To generate your own client certificate, use <span class="command"><strong>keytool</strong></span>
					to create a suitable certificate and add it to the
					<code class="filename">keystore</code>
					file:
				</p>
				<pre class="programlisting">shell&gt; keytool -genkey -keyalg rsa \
     -alias mysqlClientCertificate -keystore keystore </pre>
				<p>
					Keytool will prompt you for the following information, and create a
					keystore named
					<code class="filename">keystore</code>
					in the current directory.
				</p>
				<p>Respond with information that is appropriate for your
					situation:</p>
				<pre class="programlisting">Enter keystore password:  *********
What is your first and last name?
  [Unknown]:  Matthews
What is the name of your organizational unit?
  [Unknown]:  Software Development
What is the name of your organization?
  [Unknown]:  MySQL AB
What is the name of your City or Locality?
  [Unknown]:  Flossmoor
What is the name of your State or Province?
  [Unknown]:  IL
What is the two-letter country code for this unit?
  [Unknown]:  US
Is &lt;CN=Matthews, OU=Software Development, O=MySQL AB,
 L=Flossmoor, ST=IL, C=US&gt; correct?
  [no]:  y
Enter key password for &lt;mysqlClientCertificate&gt;
        (RETURN if same as keystore password):</pre>
				<p>
					Finally, to get JSSE to use the keystore and truststore that you
					have generated, you need to set the following system properties
					when you start your JVM, replacing <em class="replaceable"><code>path_to_keystore_file</code></em>
					with the full path to the keystore file you created, <em
						class="replaceable"><code>path_to_truststore_file</code></em> with
					the path to the truststore file you created, and using the
					appropriate password values for each property. You can do this
					either on the command line:
				</p>
				<pre class="programlisting">-Djavax.net.ssl.keyStore=<em
						class="replaceable"><code>path_to_keystore_file</code></em>
-Djavax.net.ssl.keyStorePassword=<em class="replaceable"><code>password</code></em>
-Djavax.net.ssl.trustStore=<em class="replaceable"><code>path_to_truststore_file</code></em>
-Djavax.net.ssl.trustStorePassword=<em class="replaceable"><code>password</code></em>
</pre>
				<p>Or you can set the values directly within the application:</p>
				<pre class="programlisting">System.setProperty("javax.net.ssl.keyStore","<em
						class="replaceable"><code>path_to_keystore_file</code></em>");
System.setProperty("javax.net.ssl.keyStorePassword","<em
						class="replaceable"><code>password</code></em>");
System.setProperty("javax.net.ssl.trustStore","<em class="replaceable"><code>path_to_truststore_file</code></em>");
System.setProperty("javax.net.ssl.trustStorePassword","<em
						class="replaceable"><code>password</code></em>");
</pre>
				<p>
					You will also need to set
					<code class="literal">useSSL</code>
					to
					<code class="literal">true</code>
					in your connection parameters for MySQL Connector/J, either by
					adding
					<code class="literal">useSSL=true</code>
					to your URL, or by setting the property
					<code class="literal">useSSL</code>
					to
					<code class="literal">true</code>
					in the
					<code class="classname">java.util.Properties</code>
					instance you pass to
					<code class="literal">DriverManager.getConnection()</code>
					.
				</p>
				<p>You can test that SSL is working by turning on JSSE debugging
					(as detailed below), and look for the following key events:</p>
				<pre class="programlisting">...
*** ClientHello, v3.1
RandomCookie:  GMT: 1018531834 bytes = { 199, 148, 180, 215, 74, 12, »
  54, 244, 0, 168, 55, 103, 215, 64, 16, 138, 225, 190, 132, 153, 2, »
  217, 219, 239, 202, 19, 121, 78 }
Session ID:  {}
Cipher Suites:  { 0, 5, 0, 4, 0, 9, 0, 10, 0, 18, 0, 19, 0, 3, 0, 17 }
Compression Methods:  { 0 }
***
[write] MD5 and SHA1 hashes:  len = 59
0000: 01 00 00 37 03 01 3D B6 90 FA C7 94 B4 D7 4A 0C  ...7..=.......J.
0010: 36 F4 00 A8 37 67 D7 40 10 8A E1 BE 84 99 02 D9  6...7g.@........
0020: DB EF CA 13 79 4E 00 00 10 00 05 00 04 00 09 00  ....yN..........
0030: 0A 00 12 00 13 00 03 00 11 01 00                 ...........
main, WRITE:  SSL v3.1 Handshake, length = 59
main, READ:  SSL v3.1 Handshake, length = 74
*** ServerHello, v3.1
RandomCookie:  GMT: 1018577560 bytes = { 116, 50, 4, 103, 25, 100, 58, »
   202, 79, 185, 178, 100, 215, 66, 254, 21, 83, 187, 190, 42, 170, 3, »
   132, 110, 82, 148, 160, 92 }
Session ID:  {163, 227, 84, 53, 81, 127, 252, 254, 178, 179, 68, 63, »
   182, 158, 30, 11, 150, 79, 170, 76, 255, 92, 15, 226, 24, 17, 177, »
   219, 158, 177, 187, 143}
Cipher Suite:  { 0, 5 }
Compression Method: 0
***
%% Created:  [Session-1, SSL_RSA_WITH_RC4_128_SHA]
** SSL_RSA_WITH_RC4_128_SHA
[read] MD5 and SHA1 hashes:  len = 74
0000: 02 00 00 46 03 01 3D B6 43 98 74 32 04 67 19 64  ...F..=.C.t2.g.d
0010: 3A CA 4F B9 B2 64 D7 42 FE 15 53 BB BE 2A AA 03  :.O..d.B..S..*..
0020: 84 6E 52 94 A0 5C 20 A3 E3 54 35 51 7F FC FE B2  .nR..\ ..T5Q....
0030: B3 44 3F B6 9E 1E 0B 96 4F AA 4C FF 5C 0F E2 18  .D?.....O.L.\...
0040: 11 B1 DB 9E B1 BB 8F 00 05 00                    ..........
main, READ:  SSL v3.1 Handshake, length = 1712
...</pre>
				<p>
					JSSE provides debugging (to
					<code class="literal">stdout</code>
					) when you set the following system property:
					<code class="literal">-Djavax.net.debug=all</code>
					This will tell you what keystores and truststores are being used,
					as well as what is going on during the SSL handshake and
					certificate exchange. It will be helpful when trying to determine
					what is not working when trying to get an SSL connection to happen.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-using-pam"></a>5.6. Connecting Using PAM
								Authentication
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id562146"></a>
				<p>Java applications using Connector/J 5.1.21 and higher can can
					connect to MySQL servers that use the pluggable authentication
					module (PAM) authentication scheme.</p>
				<p>For PAM authentication to work, you must have the following:
				</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								A MySQL server that supports PAM authentication: a commercial
								distribution of MySQL 5.5.16 or higher. See <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/pam-authentication-plugin.html"
									target="_top">The PAM Authentication Plugin</a> for more
								information. Connector/J implements the same cleartext
								authentication method as in <a class="ulink"
									href="http://dev.mysql.com/doc/refman/5.5/en/cleartext-authentication-plugin.html"
									target="_top">The Cleartext Client-Side Authentication
									Plugin</a>.
							</p></li>
						<li class="listitem"><p>
								SSL capability, as explained in <a class="xref"
									href="#connector-j-reference-using-ssl"
									title="5.5. Connecting Securely Using SSL">Section 5.5,
									“Connecting Securely Using SSL”</a>. Because the PAM authentication
								scheme sends the original password to the server, the connection
								to the server must be encrypted.
							</p></li>
					</ul>
				</div>
				<p>PAM authentication support is enabled by default in
					Connector/J 5.1.21 and up, so no extra configuration is needed.</p>
				<p>
					To disable the PAM authentication feature, specify
					<code class="literal">mysql_clear_password</code>
					(the method) or
					<code class="literal">com.mysql.jdbc.authentication.MysqlClearPasswordPlugin</code>
					(the class name) in the comma-separated list of arguments for the
					<code class="literal">disabledAuthenticationPlugins</code>
					connection option. See <a class="xref"
						href="#connector-j-reference-configuration-properties"
						title="5.1. Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J">Section 5.1,
						“Driver/Datasource Class Names, URL Syntax and Configuration
						Properties for Connector/J”</a> for details about that connection
					option.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-replication-connection"></a>5.7. Using
								Master/Slave Replication with ReplicationConnection
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id562249"></a>
				<p>
					Connector/J 3.1.7 and higher includes a variant of the driver that
					will automatically send queries to a read/write master, or a
					failover or round-robin loadbalanced set of slaves based on the
					state of
					<code class="literal">Connection.getReadOnly()</code>
					.
				</p>
				<p>
					An application signals that it wants a transaction to be read-only
					by calling
					<code class="literal">Connection.setReadOnly(true)</code>
					, this replication-aware connection will use one of the slave
					connections, which are load-balanced per-vm using a round-robin
					scheme (a given connection is sticky to a slave unless that slave
					is removed from service). If you have a write transaction, or if
					you have a read that is time-sensitive (remember, replication in
					MySQL is asynchronous), set the connection to be not read-only, by
					calling
					<code class="literal">Connection.setReadOnly(false)</code>
					and the driver will ensure that further calls are sent to the
					master MySQL server. The driver takes care of propagating the
					current state of autocommit, isolation level, and catalog between
					all of the connections that it uses to accomplish this load
					balancing functionality.
				</p>
				<p>
					To enable this functionality, use the
					<code class="literal">com.mysql.jdbc.ReplicationDriver</code>
					class when configuring your application server's connection pool or
					when creating an instance of a JDBC driver for your standalone
					application. Because it accepts the same URL format as the standard
					MySQL JDBC driver,
					<code class="literal">ReplicationDriver</code>
					does not currently work with
					<code class="literal">java.sql.DriverManager</code>
					-based connection creation unless it is the only MySQL JDBC driver
					registered with the
					<code class="literal">DriverManager</code>
					.
				</p>
				<p>
					Here is a short example of how
					<code class="literal">ReplicationDriver</code>
					might be used in a standalone application:
				</p>
				<a name="connector-j-using-replication-driver-example"></a>
				<pre class="programlisting">import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;
import com.mysql.jdbc.ReplicationDriver;
public class ReplicationDriverDemo {
  public static void main(String[] args) throws Exception {
    ReplicationDriver driver = new ReplicationDriver();
    Properties props = new Properties();
    // We want this for failover on the slaves
    props.put("autoReconnect", "true");
    // We want to load balance between the slaves
    props.put("roundRobinLoadBalance", "true");
    props.put("user", "foo");
    props.put("password", "bar");
    //
    // Looks like a normal MySQL JDBC url, with a
    // comma-separated list of hosts, the first
    // being the 'master', the rest being any number
    // of slaves that the driver will load balance against
    //
    Connection conn =
        driver.connect("jdbc:mysql:replication://master,slave1,slave2,slave3/test",
            props);
    //
    // Perform read/write work on the master
    // by setting the read-only flag to "false"
    //
    conn.setReadOnly(false);
    conn.setAutoCommit(false);
    conn.createStatement().executeUpdate("UPDATE some_table ....");
    conn.commit();
    //
    // Now, do a query from a slave, the driver automatically picks one
    // from the list
    //
    conn.setReadOnly(true);
    ResultSet rs =
      conn.createStatement().executeQuery("SELECT a,b FROM alt_table");
     .......
  }
}</pre>
				<p>
					Consider investigating the Load Balancing JDBC Pool (<span
						class="command"><strong>lbpool</strong></span>) tool, which
					provides a wrapper around the standard JDBC driver and enables you
					to use DB connection pools that includes checks for system failures
					and uneven load distribution. For more information, see <a
						class="ulink" href="http://code.tailrank.com/lbpool" target="_top">Load
						Balancing JDBC Pool (lbpool)</a>.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-reference-error-sqlstates"></a>5.8. Mapping
								MySQL Error Numbers to JDBC SQLState Codes
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id562384"></a><a class="indexterm"
					name="id562393"></a><a class="indexterm" name="id562402"></a><a
					class="indexterm" name="id562414"></a><a class="indexterm"
					name="id562426"></a><a class="indexterm" name="id562435"></a><a
					class="indexterm" name="id562444"></a><a class="indexterm"
					name="id562453"></a><a class="indexterm" name="id562462"></a><a
					class="indexterm" name="id562471"></a><a class="indexterm"
					name="id562480"></a><a class="indexterm" name="id562489"></a><a
					class="indexterm" name="id562498"></a><a class="indexterm"
					name="id562507"></a><a class="indexterm" name="id562516"></a><a
					class="indexterm" name="id562525"></a><a class="indexterm"
					name="id562534"></a><a class="indexterm" name="id562543"></a><a
					class="indexterm" name="id562552"></a><a class="indexterm"
					name="id562561"></a><a class="indexterm" name="id562570"></a><a
					class="indexterm" name="id562578"></a><a class="indexterm"
					name="id562587"></a><a class="indexterm" name="id562596"></a><a
					class="indexterm" name="id562605"></a><a class="indexterm"
					name="id562614"></a><a class="indexterm" name="id562623"></a><a
					class="indexterm" name="id562632"></a><a class="indexterm"
					name="id562641"></a><a class="indexterm" name="id562650"></a><a
					class="indexterm" name="id562659"></a><a class="indexterm"
					name="id562668"></a><a class="indexterm" name="id562677"></a><a
					class="indexterm" name="id562686"></a><a class="indexterm"
					name="id562695"></a><a class="indexterm" name="id562704"></a><a
					class="indexterm" name="id562713"></a><a class="indexterm"
					name="id562722"></a><a class="indexterm" name="id562730"></a><a
					class="indexterm" name="id562739"></a><a class="indexterm"
					name="id562748"></a><a class="indexterm" name="id562757"></a><a
					class="indexterm" name="id562766"></a><a class="indexterm"
					name="id562775"></a><a class="indexterm" name="id562784"></a><a
					class="indexterm" name="id562793"></a><a class="indexterm"
					name="id562802"></a><a class="indexterm" name="id562812"></a><a
					class="indexterm" name="id562820"></a><a class="indexterm"
					name="id562829"></a><a class="indexterm" name="id562838"></a><a
					class="indexterm" name="id562847"></a><a class="indexterm"
					name="id562856"></a><a class="indexterm" name="id562865"></a><a
					class="indexterm" name="id562874"></a><a class="indexterm"
					name="id562883"></a><a class="indexterm" name="id562892"></a><a
					class="indexterm" name="id562902"></a><a class="indexterm"
					name="id562910"></a><a class="indexterm" name="id562919"></a><a
					class="indexterm" name="id562928"></a><a class="indexterm"
					name="id562937"></a><a class="indexterm" name="id562946"></a><a
					class="indexterm" name="id562955"></a><a class="indexterm"
					name="id562964"></a><a class="indexterm" name="id562973"></a><a
					class="indexterm" name="id562982"></a><a class="indexterm"
					name="id562991"></a><a class="indexterm" name="id563000"></a><a
					class="indexterm" name="id563009"></a><a class="indexterm"
					name="id563018"></a><a class="indexterm" name="id563027"></a><a
					class="indexterm" name="id563036"></a><a class="indexterm"
					name="id563045"></a><a class="indexterm" name="id563054"></a><a
					class="indexterm" name="id563063"></a><a class="indexterm"
					name="id563072"></a><a class="indexterm" name="id563081"></a><a
					class="indexterm" name="id563090"></a><a class="indexterm"
					name="id563099"></a><a class="indexterm" name="id563108"></a><a
					class="indexterm" name="id563117"></a><a class="indexterm"
					name="id563126"></a><a class="indexterm" name="id563135"></a><a
					class="indexterm" name="id563144"></a><a class="indexterm"
					name="id563153"></a><a class="indexterm" name="id563162"></a><a
					class="indexterm" name="id563171"></a><a class="indexterm"
					name="id563180"></a><a class="indexterm" name="id563189"></a><a
					class="indexterm" name="id563198"></a><a class="indexterm"
					name="id563207"></a><a class="indexterm" name="id563216"></a><a
					class="indexterm" name="id563225"></a><a class="indexterm"
					name="id563234"></a><a class="indexterm" name="id563243"></a><a
					class="indexterm" name="id563252"></a><a class="indexterm"
					name="id563261"></a><a class="indexterm" name="id563270"></a><a
					class="indexterm" name="id563279"></a><a class="indexterm"
					name="id563288"></a><a class="indexterm" name="id563297"></a><a
					class="indexterm" name="id563306"></a><a class="indexterm"
					name="id563315"></a><a class="indexterm" name="id563324"></a><a
					class="indexterm" name="id563333"></a><a class="indexterm"
					name="id563342"></a><a class="indexterm" name="id563351"></a><a
					class="indexterm" name="id563360"></a><a class="indexterm"
					name="id563369"></a><a class="indexterm" name="id563378"></a><a
					class="indexterm" name="id563387"></a><a class="indexterm"
					name="id563396"></a><a class="indexterm" name="id563405"></a><a
					class="indexterm" name="id563414"></a><a class="indexterm"
					name="id563423"></a><a class="indexterm" name="id563432"></a><a
					class="indexterm" name="id563440"></a><a class="indexterm"
					name="id563449"></a><a class="indexterm" name="id563458"></a><a
					class="indexterm" name="id563467"></a><a class="indexterm"
					name="id563476"></a><a class="indexterm" name="id563485"></a><a
					class="indexterm" name="id563494"></a><a class="indexterm"
					name="id563503"></a><a class="indexterm" name="id563512"></a><a
					class="indexterm" name="id563521"></a><a class="indexterm"
					name="id563530"></a><a class="indexterm" name="id563539"></a><a
					class="indexterm" name="id563548"></a><a class="indexterm"
					name="id563557"></a><a class="indexterm" name="id563566"></a><a
					class="indexterm" name="id563575"></a><a class="indexterm"
					name="id563584"></a><a class="indexterm" name="id563593"></a><a
					class="indexterm" name="id563602"></a><a class="indexterm"
					name="id563611"></a>
				<p>
					The table below provides a mapping of the MySQL error numbers to
					JDBC
					<code class="literal">SQLState</code>
					values.
				</p>
				<div class="table">
					<a name="id563630"></a>
					<p class="title">
						<b>Table 5.1. Mapping of MySQL Error Numbers to SQLStates</b>
					</p>
					<div class="table-contents">
						<table summary="Mapping of MySQL Error Numbers to SQLStates"
							border="1">
							<colgroup>
								<col>
								<col>
								<col>
								<col>
							</colgroup>
							<thead>
								<tr>
									<th scope="col">MySQL Error Number</th>
									<th scope="col">MySQL Error Name</th>
									<th scope="col">Legacy (X/Open) SQLState</th>
									<th scope="col">SQL Standard SQLState</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td scope="row">1022</td>
									<td><code class="literal">ER_DUP_KEY</code></td>
									<td>S1000</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1037</td>
									<td><code class="literal">ER_OUTOFMEMORY</code></td>
									<td>S1001</td>
									<td>HY001</td>
								</tr>
								<tr>
									<td scope="row">1038</td>
									<td><code class="literal">ER_OUT_OF_SORTMEMORY</code></td>
									<td>S1001</td>
									<td>HY001</td>
								</tr>
								<tr>
									<td scope="row">1040</td>
									<td><code class="literal">ER_CON_COUNT_ERROR</code></td>
									<td>08004</td>
									<td>08004</td>
								</tr>
								<tr>
									<td scope="row">1042</td>
									<td><code class="literal">ER_BAD_HOST_ERROR</code></td>
									<td>08004</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1043</td>
									<td><code class="literal">ER_HANDSHAKE_ERROR</code></td>
									<td>08004</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1044</td>
									<td><code class="literal">ER_DBACCESS_DENIED_ERROR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1045</td>
									<td><code class="literal">ER_ACCESS_DENIED_ERROR</code></td>
									<td>28000</td>
									<td>28000</td>
								</tr>
								<tr>
									<td scope="row">1047</td>
									<td><code class="literal">ER_UNKNOWN_COM_ERROR</code></td>
									<td>08S01</td>
									<td>HY000</td>
								</tr>
								<tr>
									<td scope="row">1050</td>
									<td><code class="literal">ER_TABLE_EXISTS_ERROR</code></td>
									<td>S1000</td>
									<td>42S01</td>
								</tr>
								<tr>
									<td scope="row">1051</td>
									<td><code class="literal">ER_BAD_TABLE_ERROR</code></td>
									<td>42S02</td>
									<td>42S02</td>
								</tr>
								<tr>
									<td scope="row">1052</td>
									<td><code class="literal">ER_NON_UNIQ_ERROR</code></td>
									<td>S1000</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1053</td>
									<td><code class="literal">ER_SERVER_SHUTDOWN</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1054</td>
									<td><code class="literal">ER_BAD_FIELD_ERROR</code></td>
									<td>S0022</td>
									<td>42S22</td>
								</tr>
								<tr>
									<td scope="row">1055</td>
									<td><code class="literal">ER_WRONG_FIELD_WITH_GROUP</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1056</td>
									<td><code class="literal">ER_WRONG_GROUP_FIELD</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1057</td>
									<td><code class="literal">ER_WRONG_SUM_SELECT</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1058</td>
									<td><code class="literal">ER_WRONG_VALUE_COUNT</code></td>
									<td>21S01</td>
									<td>21S01</td>
								</tr>
								<tr>
									<td scope="row">1059</td>
									<td><code class="literal">ER_TOO_LONG_IDENT</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1060</td>
									<td><code class="literal">ER_DUP_FIELDNAME</code></td>
									<td>S1009</td>
									<td>42S21</td>
								</tr>
								<tr>
									<td scope="row">1061</td>
									<td><code class="literal">ER_DUP_KEYNAME</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1062</td>
									<td><code class="literal">ER_DUP_ENTRY</code></td>
									<td>S1009</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1063</td>
									<td><code class="literal">ER_WRONG_FIELD_SPEC</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1064</td>
									<td><code class="literal">ER_PARSE_ERROR</code></td>
									<td>42000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1065</td>
									<td><code class="literal">ER_EMPTY_QUERY</code></td>
									<td>42000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1066</td>
									<td><code class="literal">ER_NONUNIQ_TABLE</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1067</td>
									<td><code class="literal">ER_INVALID_DEFAULT</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1068</td>
									<td><code class="literal">ER_MULTIPLE_PRI_KEY</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1069</td>
									<td><code class="literal">ER_TOO_MANY_KEYS</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1070</td>
									<td><code class="literal">ER_TOO_MANY_KEY_PARTS</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1071</td>
									<td><code class="literal">ER_TOO_LONG_KEY</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1072</td>
									<td><code class="literal">ER_KEY_COLUMN_DOES_NOT_EXITS</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1073</td>
									<td><code class="literal">ER_BLOB_USED_AS_KEY</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1074</td>
									<td><code class="literal">ER_TOO_BIG_FIELDLENGTH</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1075</td>
									<td><code class="literal">ER_WRONG_AUTO_KEY</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1080</td>
									<td><code class="literal">ER_FORCING_CLOSE</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1081</td>
									<td><code class="literal">ER_IPSOCK_ERROR</code></td>
									<td>08S01</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1082</td>
									<td><code class="literal">ER_NO_SUCH_INDEX</code></td>
									<td>S1009</td>
									<td>42S12</td>
								</tr>
								<tr>
									<td scope="row">1083</td>
									<td><code class="literal">ER_WRONG_FIELD_TERMINATORS</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1084</td>
									<td><code class="literal">ER_BLOBS_AND_NO_TERMINATED</code></td>
									<td>S1009</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1090</td>
									<td><code class="literal">ER_CANT_REMOVE_ALL_FIELDS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1091</td>
									<td><code class="literal">ER_CANT_DROP_FIELD_OR_KEY</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1101</td>
									<td><code class="literal">ER_BLOB_CANT_HAVE_DEFAULT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1102</td>
									<td><code class="literal">ER_WRONG_DB_NAME</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1103</td>
									<td><code class="literal">ER_WRONG_TABLE_NAME</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1104</td>
									<td><code class="literal">ER_TOO_BIG_SELECT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1106</td>
									<td><code class="literal">ER_UNKNOWN_PROCEDURE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1107</td>
									<td><code class="literal">ER_WRONG_PARAMCOUNT_TO_PROCEDURE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1109</td>
									<td><code class="literal">ER_UNKNOWN_TABLE</code></td>
									<td>S1000</td>
									<td>42S02</td>
								</tr>
								<tr>
									<td scope="row">1110</td>
									<td><code class="literal">ER_FIELD_SPECIFIED_TWICE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1112</td>
									<td><code class="literal">ER_UNSUPPORTED_EXTENSION</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1113</td>
									<td><code class="literal">ER_TABLE_MUST_HAVE_COLUMNS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1115</td>
									<td><code class="literal">ER_UNKNOWN_CHARACTER_SET</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1118</td>
									<td><code class="literal">ER_TOO_BIG_ROWSIZE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1120</td>
									<td><code class="literal">ER_WRONG_OUTER_JOIN</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1121</td>
									<td><code class="literal">ER_NULL_COLUMN_IN_INDEX</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1129</td>
									<td><code class="literal">ER_HOST_IS_BLOCKED</code></td>
									<td>08004</td>
									<td>HY000</td>
								</tr>
								<tr>
									<td scope="row">1130</td>
									<td><code class="literal">ER_HOST_NOT_PRIVILEGED</code></td>
									<td>08004</td>
									<td>HY000</td>
								</tr>
								<tr>
									<td scope="row">1131</td>
									<td><code class="literal">ER_PASSWORD_ANONYMOUS_USER</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1132</td>
									<td><code class="literal">ER_PASSWORD_NOT_ALLOWED</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1133</td>
									<td><code class="literal">ER_PASSWORD_NO_MATCH</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1136</td>
									<td><code class="literal">ER_WRONG_VALUE_COUNT_ON_ROW</code></td>
									<td>S1000</td>
									<td>21S01</td>
								</tr>
								<tr>
									<td scope="row">1138</td>
									<td><code class="literal">ER_INVALID_USE_OF_NULL</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1139</td>
									<td><code class="literal">ER_REGEXP_ERROR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1140</td>
									<td><code class="literal">ER_MIX_OF_GROUP_FUNC_AND_FIELDS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1141</td>
									<td><code class="literal">ER_NONEXISTING_GRANT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1142</td>
									<td><code class="literal">ER_TABLEACCESS_DENIED_ERROR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1143</td>
									<td><code class="literal">ER_COLUMNACCESS_DENIED_ERROR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1144</td>
									<td><code class="literal">ER_ILLEGAL_GRANT_FOR_TABLE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1145</td>
									<td><code class="literal">ER_GRANT_WRONG_HOST_OR_USER</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1146</td>
									<td><code class="literal">ER_NO_SUCH_TABLE</code></td>
									<td>S1000</td>
									<td>42S02</td>
								</tr>
								<tr>
									<td scope="row">1147</td>
									<td><code class="literal">ER_NONEXISTING_TABLE_GRANT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1148</td>
									<td><code class="literal">ER_NOT_ALLOWED_COMMAND</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1149</td>
									<td><code class="literal">ER_SYNTAX_ERROR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1152</td>
									<td><code class="literal">ER_ABORTING_CONNECTION</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1153</td>
									<td><code class="literal">ER_NET_PACKET_TOO_LARGE</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1154</td>
									<td><code class="literal">ER_NET_READ_ERROR_FROM_PIPE</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1155</td>
									<td><code class="literal">ER_NET_FCNTL_ERROR</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1156</td>
									<td><code class="literal">ER_NET_PACKETS_OUT_OF_ORDER</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1157</td>
									<td><code class="literal">ER_NET_UNCOMPRESS_ERROR</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1158</td>
									<td><code class="literal">ER_NET_READ_ERROR</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1159</td>
									<td><code class="literal">ER_NET_READ_INTERRUPTED</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1160</td>
									<td><code class="literal">ER_NET_ERROR_ON_WRITE</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1161</td>
									<td><code class="literal">ER_NET_WRITE_INTERRUPTED</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1162</td>
									<td><code class="literal">ER_TOO_LONG_STRING</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1163</td>
									<td><code class="literal">ER_TABLE_CANT_HANDLE_BLOB</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1164</td>
									<td><code class="literal">ER_TABLE_CANT_HANDLE_AUTO_INCREMENT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1166</td>
									<td><code class="literal">ER_WRONG_COLUMN_NAME</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1167</td>
									<td><code class="literal">ER_WRONG_KEY_COLUMN</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1169</td>
									<td><code class="literal">ER_DUP_UNIQUE</code></td>
									<td>S1000</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1170</td>
									<td><code class="literal">ER_BLOB_KEY_WITHOUT_LENGTH</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1171</td>
									<td><code class="literal">ER_PRIMARY_CANT_HAVE_NULL</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1172</td>
									<td><code class="literal">ER_TOO_MANY_ROWS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1173</td>
									<td><code class="literal">ER_REQUIRES_PRIMARY_KEY</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1177</td>
									<td><code class="literal">ER_CHECK_NO_SUCH_TABLE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1178</td>
									<td><code class="literal">ER_CHECK_NOT_IMPLEMENTED</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1179</td>
									<td><code class="literal">ER_CANT_DO_THIS_DURING_AN_TRANSACTION</code></td>
									<td>S1000</td>
									<td>25000</td>
								</tr>
								<tr>
									<td scope="row">1184</td>
									<td><code class="literal">ER_NEW_ABORTING_CONNECTION</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1189</td>
									<td><code class="literal">ER_MASTER_NET_READ</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1190</td>
									<td><code class="literal">ER_MASTER_NET_WRITE</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1203</td>
									<td><code class="literal">ER_TOO_MANY_USER_CONNECTIONS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1205</td>
									<td><code class="literal">ER_LOCK_WAIT_TIMEOUT</code></td>
									<td>41000</td>
									<td>41000</td>
								</tr>
								<tr>
									<td scope="row">1207</td>
									<td><code class="literal">ER_READ_ONLY_TRANSACTION</code></td>
									<td>S1000</td>
									<td>25000</td>
								</tr>
								<tr>
									<td scope="row">1211</td>
									<td><code class="literal">ER_NO_PERMISSION_TO_CREATE_USER</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1213</td>
									<td><code class="literal">ER_LOCK_DEADLOCK</code></td>
									<td>41000</td>
									<td>40001</td>
								</tr>
								<tr>
									<td scope="row">1216</td>
									<td><code class="literal">ER_NO_REFERENCED_ROW</code></td>
									<td>S1000</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1217</td>
									<td><code class="literal">ER_ROW_IS_REFERENCED</code></td>
									<td>S1000</td>
									<td>23000</td>
								</tr>
								<tr>
									<td scope="row">1218</td>
									<td><code class="literal">ER_CONNECT_TO_MASTER</code></td>
									<td>S1000</td>
									<td>08S01</td>
								</tr>
								<tr>
									<td scope="row">1222</td>
									<td><code class="literal">ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT</code></td>
									<td>S1000</td>
									<td>21000</td>
								</tr>
								<tr>
									<td scope="row">1226</td>
									<td><code class="literal">ER_USER_LIMIT_REACHED</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1230</td>
									<td><code class="literal">ER_NO_DEFAULT</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1231</td>
									<td><code class="literal">ER_WRONG_VALUE_FOR_VAR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1232</td>
									<td><code class="literal">ER_WRONG_TYPE_FOR_VAR</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1234</td>
									<td><code class="literal">ER_CANT_USE_OPTION_HERE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1235</td>
									<td><code class="literal">ER_NOT_SUPPORTED_YET</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1239</td>
									<td><code class="literal">ER_WRONG_FK_DEF</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1241</td>
									<td><code class="literal">ER_OPERAND_COLUMNS</code></td>
									<td>S1000</td>
									<td>21000</td>
								</tr>
								<tr>
									<td scope="row">1242</td>
									<td><code class="literal">ER_SUBQUERY_NO_1_ROW</code></td>
									<td>S1000</td>
									<td>21000</td>
								</tr>
								<tr>
									<td scope="row">1247</td>
									<td><code class="literal">ER_ILLEGAL_REFERENCE</code></td>
									<td>S1000</td>
									<td>42S22</td>
								</tr>
								<tr>
									<td scope="row">1248</td>
									<td><code class="literal">ER_DERIVED_MUST_HAVE_ALIAS</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1249</td>
									<td><code class="literal">ER_SELECT_REDUCED</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1250</td>
									<td><code class="literal">ER_TABLENAME_NOT_ALLOWED_HERE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1251</td>
									<td><code class="literal">ER_NOT_SUPPORTED_AUTH_MODE</code></td>
									<td>S1000</td>
									<td>08004</td>
								</tr>
								<tr>
									<td scope="row">1252</td>
									<td><code class="literal">ER_SPATIAL_CANT_HAVE_NULL</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1253</td>
									<td><code class="literal">ER_COLLATION_CHARSET_MISMATCH</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1261</td>
									<td><code class="literal">ER_WARN_TOO_FEW_RECORDS</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1262</td>
									<td><code class="literal">ER_WARN_TOO_MANY_RECORDS</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1263</td>
									<td><code class="literal">ER_WARN_NULL_TO_NOTNULL</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1264</td>
									<td><code class="literal">ER_WARN_DATA_OUT_OF_RANGE</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1265</td>
									<td><code class="literal">ER_WARN_DATA_TRUNCATED</code></td>
									<td>S1000</td>
									<td>01000</td>
								</tr>
								<tr>
									<td scope="row">1280</td>
									<td><code class="literal">ER_WRONG_NAME_FOR_INDEX</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1281</td>
									<td><code class="literal">ER_WRONG_NAME_FOR_CATALOG</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
								<tr>
									<td scope="row">1286</td>
									<td><code class="literal">ER_UNKNOWN_STORAGE_ENGINE</code></td>
									<td>S1000</td>
									<td>42000</td>
								</tr>
							</tbody>
						</table>
					</div>
				</div>
				<br class="table-break">
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-basic"></a>Chapter 6. JDBC
							Concepts
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-connect-drivermanager">6.1.
								Connecting to MySQL Using the JDBC <code class="literal">DriverManager</code>
								Interface
						</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-statements">6.2. Using JDBC <code
									class="literal">Statement</code> Objects to Execute SQL
						</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-statements-callable">6.3. Using
								JDBC <code class="literal">CallableStatements</code> to Execute
								Stored Procedures
						</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-last-insert-id">6.4. Retrieving
								<code class="literal">AUTO_INCREMENT</code> Column Values
								through JDBC
						</a></span>
					</dt>
				</dl>
			</div>
			<a class="indexterm" name="id566433"></a>
			<p>This section provides some general JDBC background.</p>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-connect-drivermanager"></a>6.1. Connecting
								to MySQL Using the JDBC
								<code class="literal">DriverManager</code>
								Interface
							</h2>
						</div>
					</div>
				</div>
				<p>
					When you are using JDBC outside of an application server, the
					<code class="literal">DriverManager</code>
					class manages the establishment of Connections.
				</p>
				<p>
					Specify to the
					<code class="literal">DriverManager</code>
					which JDBC drivers to try to make Connections with. The easiest way
					to do this is to use
					<code class="literal">Class.forName()</code>
					on the class that implements the
					<code class="literal">java.sql.Driver</code>
					interface. With MySQL Connector/J, the name of this class is
					<code class="literal">com.mysql.jdbc.Driver</code>
					. With this method, you could use an external configuration file to
					supply the driver class name and driver parameters to use when
					connecting to a database.
				</p>
				<p>
					The following section of Java code shows how you might register
					MySQL Connector/J from the
					<code class="function">main()</code>
					method of your application. If testing this code, first read the
					installation section at <a class="xref"
						href="#connector-j-installing"
						title="Chapter 3. Connector/J Installation">Chapter 3, <i>Connector/J
							Installation</i></a>, to make sure you have connector installed correctly
					and the
					<code class="literal">CLASSPATH</code>
					set up. Also, ensure that MySQL is configured to accept external
					TCP/IP connections.
				</p>
				<pre class="programlisting">import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
// Notice, do not import com.mysql.jdbc.*
// or you will have problems!
public class LoadDriver {
    public static void main(String[] args) {
        try {
            // The newInstance() call is a work around for some
            // broken Java implementations
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            // handle the error
        }
    }
}</pre>
				<p>
					After the driver has been registered with the
					<code class="literal">DriverManager</code>
					, you can obtain a
					<code class="literal">Connection</code>
					instance that is connected to a particular database by calling
					<code class="literal">DriverManager.getConnection()</code>
					:
				</p>
				<div class="example">
					<a name="connector-j-examples-connection-drivermanager"></a>
					<p class="title">
						<b>Example 6.1. Connector/J: Obtaining a connection from the <code
								class="literal">DriverManager</code></b>
					</p>
					<div class="example-contents">
						<p>
							If you have not already done so, please review the section <a
								class="xref"
								href="#connector-j-usagenotes-connect-drivermanager"
								title="6.1. Connecting to MySQL Using the JDBC DriverManager Interface">Section 6.1,
								“Connecting to MySQL Using the JDBC <code class="literal">DriverManager</code>
								Interface”
							</a> before working with these examples.
						</p>
						<p>
							This example shows how you can obtain a
							<code class="literal">Connection</code>
							instance from the
							<code class="literal">DriverManager</code>
							. There are a few different signatures for the
							<code class="function">getConnection()</code>
							method. Consult the API documentation that comes with your JDK
							for more specific information on how to use them.
						</p>
						<pre class="programlisting">import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
Connection conn = null;
...
try {
    conn =
       DriverManager.getConnection("jdbc:mysql://localhost/test?" +
                                   "user=monty&amp;password=greatsqldb");
    // Do something with the Connection
   ...
} catch (SQLException ex) {
    // handle any errors
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
}</pre>
						<p>
							Once a
							<code class="classname">Connection</code>
							is established, it can be used to create
							<code class="classname">Statement</code>
							and
							<code class="classname">PreparedStatement</code>
							objects, as well as retrieve metadata about the database. This is
							explained in the following sections.
						</p>
					</div>
				</div>
				<br class="example-break">
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-statements"></a>6.2. Using JDBC
								<code class="literal">Statement</code>
								Objects to Execute SQL
							</h2>
						</div>
					</div>
				</div>
				<p>
					<code class="classname">Statement</code>
					objects allow you to execute basic SQL queries and retrieve the
					results through the
					<code class="literal">ResultSet</code>
					class, which is described later.
				</p>
				<p>
					To create a
					<code class="classname">Statement</code>
					instance, you call the
					<code class="function">createStatement()</code>
					method on the
					<code class="literal">Connection</code>
					object you have retrieved using one of the
					<code class="literal">DriverManager.getConnection()</code>
					or
					<code class="literal">DataSource.getConnection()</code>
					methods described earlier.
				</p>
				<p>
					Once you have a
					<code class="classname">Statement</code>
					instance, you can execute a <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
						target="_top"><code class="literal">SELECT</code></a> query by
					calling the
					<code class="function">executeQuery(String)</code>
					method with the SQL you want to use.
				</p>
				<p>
					To update data in the database, use the
					<code class="function">executeUpdate(String SQL)</code>
					method. This method returns the number of rows matched by the
					update statement, not the number of rows that were modified.
				</p>
				<p>
					If you do not know ahead of time whether the SQL statement will be
					a <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
						target="_top"><code class="literal">SELECT</code></a> or an <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
						target="_top"><code class="literal">UPDATE</code></a>/<a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
						target="_top"><code class="literal">INSERT</code></a>, then you
					can use the
					<code class="function">execute(String SQL)</code>
					method. This method will return true if the SQL query was a <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
						target="_top"><code class="literal">SELECT</code></a>, or false if
					it was an <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
						target="_top"><code class="literal">UPDATE</code></a>, <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
						target="_top"><code class="literal">INSERT</code></a>, or <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/delete.html"
						target="_top"><code class="literal">DELETE</code></a> statement.
					If the statement was a <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
						target="_top"><code class="literal">SELECT</code></a> query, you
					can retrieve the results by calling the
					<code class="function">getResultSet()</code>
					method. If the statement was an <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
						target="_top"><code class="literal">UPDATE</code></a>, <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
						target="_top"><code class="literal">INSERT</code></a>, or <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/delete.html"
						target="_top"><code class="literal">DELETE</code></a> statement,
					you can retrieve the affected rows count by calling
					<code class="function">getUpdateCount()</code>
					on the
					<code class="classname">Statement</code>
					instance.
				</p>
				<div class="example">
					<a name="connector-j-examples-execute-select"></a>
					<p class="title">
						<b>Example 6.2. Connector/J: Using java.sql.Statement to
							execute a <code class="literal">SELECT</code> query
						</b>
					</p>
					<div class="example-contents">
						<pre class="programlisting">import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
// assume that conn is an already created JDBC connection (see previous examples)
Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT foo FROM bar");
    // or alternatively, if you don't know ahead of time that
    // the query will be a SELECT...
    if (stmt.execute("SELECT foo FROM bar")) {
        rs = stmt.getResultSet();
    }
    // Now do something with the ResultSet ....
}
catch (SQLException ex){
    // handle any errors
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
}
finally {
    // it is a good idea to release
    // resources in a finally{} block
    // in reverse-order of their creation
    // if they are no-longer needed
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException sqlEx) { } // ignore
        rs = null;
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException sqlEx) { } // ignore
        stmt = null;
    }
}</pre>
					</div>
				</div>
				<br class="example-break">
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-statements-callable"></a>6.3. Using
								JDBC
								<code class="literal">CallableStatements</code>
								to Execute Stored Procedures
							</h2>
						</div>
					</div>
				</div>
				<p>
					Starting with MySQL server version 5.0 when used with Connector/J
					3.1.1 or newer, the
					<code class="classname">java.sql.CallableStatement</code>
					interface is fully implemented with the exception of the
					<code class="function">getParameterMetaData()</code>
					method.
				</p>
				<p>
					For more information on MySQL stored procedures, please refer to <a
						class="ulink"
						href="http://dev.mysql.com/doc/mysql/en/stored-routines.html"
						target="_top">http://dev.mysql.com/doc/mysql/en/stored-routines.html</a>.
				</p>
				<p>
					Connector/J exposes stored procedure functionality through JDBC's
					<code class="classname">CallableStatement</code>
					interface.
				</p>
				<div xmlns="http://www.w3.org/1999/xhtml" class="note"
					style="margin-left: 0.5in; margin-right: 0.5in;">
					<div class="admon-title">Note</div>
					<p xmlns="">
						Current versions of MySQL server do not return enough information
						for the JDBC driver to provide result set metadata for callable
						statements. This means that when using
						<code class="literal">CallableStatement</code>
						,
						<code class="literal">ResultSetMetaData</code>
						may return
						<code class="literal">NULL</code>
						.
					</p>
				</div>
				<p>
					The following example shows a stored procedure that returns the
					value of
					<code class="varname">inOutParam</code>
					incremented by 1, and the string passed in using
					<code class="varname">inputParam</code>
					as a
					<code class="classname">ResultSet</code>
					:
				</p>
				<div class="example">
					<a name="connector-j-examples-stored-procedure"></a>
					<p class="title">
						<b>Example 6.3. Connector/J: Calling Stored Procedures</b>
					</p>
					<div class="example-contents">
						<pre class="programlisting">CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), \
                        INOUT inOutParam INT)
BEGIN
    DECLARE z INT;
    SET z = inOutParam + 1;
    SET inOutParam = z;
    SELECT inputParam;
    SELECT CONCAT('zyxw', inputParam);
END</pre>
					</div>
				</div>
				<p>
					<br class="example-break">
				</p>
				<p>
					To use the
					<code class="literal">demoSp</code>
					procedure with Connector/J, follow these steps:
				</p>
				<div class="orderedlist">
					<ol class="orderedlist" type="1">
						<li class="listitem"><p>
								Prepare the callable statement by using
								<code class="literal">Connection.prepareCall()</code>
								.
							</p>
							<p>Notice that you have to use JDBC escape syntax, and that
								the parentheses surrounding the parameter placeholders are not
								optional:</p>
							<div class="example">
								<a name="connector-j-examples-preparecall"></a>
								<p class="title">
									<b>Example 6.4. Connector/J: Using <code class="literal">Connection.prepareCall()</code></b>
								</p>
								<div class="example-contents">
									<pre class="programlisting">import java.sql.CallableStatement;
...
    //
    // Prepare a call to the stored procedure 'demoSp'
    // with two parameters
    //
    // Notice the use of JDBC-escape syntax ({call ...})
    //
    CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}");
    cStmt.setString(1, "abcdefg");</pre>
								</div>
							</div>
							<br class="example-break">
						<div xmlns="http://www.w3.org/1999/xhtml" class="note"
								style="margin-left: 0.5in; margin-right: 0.5in;">
								<div class="admon-title">Note</div>
								<p xmlns="">
									<code class="literal">Connection.prepareCall()</code>
									is an expensive method, due to the metadata retrieval that the
									driver performs to support output parameters. For performance
									reasons, minimize unnecessary calls to
									<code class="literal">Connection.prepareCall()</code>
									by reusing
									<code class="classname">CallableStatement</code>
									instances in your code.
								</p>
							</div></li>
						<li class="listitem"><p>Register the output parameters
								(if any exist)</p>
							<p>
								To retrieve the values of output parameters (parameters
								specified as
								<code class="literal">OUT</code>
								or
								<code class="literal">INOUT</code>
								when you created the stored procedure), JDBC requires that they
								be specified before statement execution using the various
								<code class="function">registerOutputParameter()</code>
								methods in the
								<code class="classname">CallableStatement</code>
								interface:
							</p>
							<div class="example">
								<a name="connector-j-examples-output-param"></a>
								<p class="title">
									<b>Example 6.5. Connector/J: Registering output parameters</b>
								</p>
								<div class="example-contents">
									<pre class="programlisting">import java.sql.Types;
...
//
// Connector/J supports both named and indexed
// output parameters. You can register output
// parameters using either method, as well
// as retrieve output parameters using either
// method, regardless of what method was
// used to register them.
//
// The following examples show how to use
// the various methods of registering
// output parameters (you should of course
// use only one registration per parameter).
//
//
// Registers the second parameter as output, and
// uses the type 'INTEGER' for values returned from
// getObject()
//
cStmt.registerOutParameter(2, Types.INTEGER);
//
// Registers the named parameter 'inOutParam', and
// uses the type 'INTEGER' for values returned from
// getObject()
//
cStmt.registerOutParameter("inOutParam", Types.INTEGER);
...</pre>
								</div>
							</div>
							<p>
								<br class="example-break">
							</p></li>
						<li class="listitem"><p>Set the input parameters (if any
								exist)</p>
							<p>
								Input and in/out parameters are set as for
								<code class="classname">PreparedStatement</code>
								objects. However,
								<code class="classname">CallableStatement</code>
								also supports setting parameters by name:
							</p>
							<div class="example">
								<a name="connector-j-examples-callablestatement"></a>
								<p class="title">
									<b>Example 6.6. Connector/J: Setting <code class="literal">CallableStatement</code>
										input parameters
									</b>
								</p>
								<div class="example-contents">
									<pre class="programlisting">...
    //
    // Set a parameter by index
    //
    cStmt.setString(1, "abcdefg");
    //
    // Alternatively, set a parameter using
    // the parameter name
    //
    cStmt.setString("inputParameter", "abcdefg");
    //
    // Set the 'in/out' parameter using an index
    //
    cStmt.setInt(2, 1);
    //
    // Alternatively, set the 'in/out' parameter
    // by name
    //
    cStmt.setInt("inOutParam", 1);
...</pre>
								</div>
							</div>
							<p>
								<br class="example-break">
							</p></li>
						<li class="listitem"><p>
								Execute the
								<code class="classname">CallableStatement</code>
								, and retrieve any result sets or output parameters.
							</p>
							<p>
								Although
								<code class="classname">CallableStatement</code>
								supports calling any of the
								<code class="classname">Statement</code>
								execute methods (
								<code class="function">executeUpdate()</code>
								,
								<code class="function">executeQuery()</code>
								or
								<code class="function">execute()</code>
								), the most flexible method to call is
								<code class="function">execute()</code>
								, as you do not need to know ahead of time if the stored
								procedure returns result sets:
							</p>
							<div class="example">
								<a name="connector-j-examples-retrieving-results-params"></a>
								<p class="title">
									<b>Example 6.7. Connector/J: Retrieving results and output
										parameter values</b>
								</p>
								<div class="example-contents">
									<pre class="programlisting">...
    boolean hadResults = cStmt.execute();
    //
    // Process all returned result sets
    //
    while (hadResults) {
        ResultSet rs = cStmt.getResultSet();
        // process result set
        ...
        hadResults = cStmt.getMoreResults();
    }
    //
    // Retrieve output parameters
    //
    // Connector/J supports both index-based and
    // name-based retrieval
    //
    int outputValue = cStmt.getInt(2); // index-based
    outputValue = cStmt.getInt("inOutParam"); // name-based
...</pre>
								</div>
							</div>
							<p>
								<br class="example-break">
							</p></li>
					</ol>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-last-insert-id"></a>6.4. Retrieving
								<code class="literal">AUTO_INCREMENT</code>
								Column Values through JDBC
							</h2>
						</div>
					</div>
				</div>
				<p>
					Before version 3.0 of the JDBC API, there was no standard way of
					retrieving key values from databases that supported auto increment
					or identity columns. With older JDBC drivers for MySQL, you could
					always use a MySQL-specific method on the
					<code class="classname">Statement</code>
					interface, or issue the query
					<code class="literal">SELECT LAST_INSERT_ID()</code>
					after issuing an <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
						target="_top"><code class="literal">INSERT</code></a> to a table
					that had an
					<code class="literal">AUTO_INCREMENT</code>
					key. Using the MySQL-specific method call isn't portable, and
					issuing a <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
						target="_top"><code class="literal">SELECT</code></a> to get the
					<code class="literal">AUTO_INCREMENT</code>
					key's value requires another round-trip to the database, which
					isn't as efficient as possible. The following code snippets
					demonstrate the three different ways to retrieve
					<code class="literal">AUTO_INCREMENT</code>
					values. First, we demonstrate the use of the new JDBC 3.0 method
					<code class="function">getGeneratedKeys()</code>
					which is now the preferred method to use if you need to retrieve
					<code class="literal">AUTO_INCREMENT</code>
					keys and have access to JDBC 3.0. The second example shows how you
					can retrieve the same value using a standard
					<code class="literal">SELECT LAST_INSERT_ID()</code>
					query. The final example shows how updatable result sets can
					retrieve the
					<code class="literal">AUTO_INCREMENT</code>
					value when using the
					<code class="function">insertRow()</code>
					method.
				</p>
				<div class="example">
					<a name="connector-j-examples-autoincrement-getgeneratedkeys"></a>
					<p class="title">
						<b>Example 6.8. Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
							column values using <code class="literal">Statement.getGeneratedKeys()</code></b>
					</p>
					<div class="example-contents">
						<pre class="programlisting">   Statement stmt = null;
   ResultSet rs = null;
   try {
    //
    // Create a Statement instance that we can use for
    // 'normal' result sets assuming you have a
    // Connection 'conn' to a MySQL database already
    // available
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_UPDATABLE);
    //
    // Issue the DDL queries for the table for this example
    //
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    //
    // Insert one row that will generate an AUTO INCREMENT
    // key in the 'priKey' field
    //
    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')",
            Statement.RETURN_GENERATED_KEYS);
    //
    // Example of using Statement.getGeneratedKeys()
    // to retrieve the value of an auto-increment
    // value
    //
    int autoIncKeyFromApi = -1;
    rs = stmt.getGeneratedKeys();
    if (rs.next()) {
        autoIncKeyFromApi = rs.getInt(1);
    } else {
        // throw an exception from here
    }
    rs.close();
    rs = null;
    System.out.println("Key returned from getGeneratedKeys():"
        + autoIncKeyFromApi);
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
}</pre>
					</div>
				</div>
				<br class="example-break">
				<div class="example">
					<a name="connector-j-examples-autoincrement-select"></a>
					<p class="title">
						<b>Example 6.9. Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
							column values using <code class="literal">SELECT
								LAST_INSERT_ID()</code></b>
					</p>
					<div class="example-contents">
						<pre class="programlisting">   Statement stmt = null;
   ResultSet rs = null;
   try {
    //
    // Create a Statement instance that we can use for
    // 'normal' result sets.
    stmt = conn.createStatement();
    //
    // Issue the DDL queries for the table for this example
    //
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    //
    // Insert one row that will generate an AUTO INCREMENT
    // key in the 'priKey' field
    //
    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')");
    //
    // Use the MySQL LAST_INSERT_ID()
    // function to do the same thing as getGeneratedKeys()
    //
    int autoIncKeyFromFunc = -1;
    rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
    if (rs.next()) {
        autoIncKeyFromFunc = rs.getInt(1);
    } else {
        // throw an exception from here
    }
    rs.close();
    System.out.println("Key returned from " +
                       "'SELECT LAST_INSERT_ID()': " +
                       autoIncKeyFromFunc);
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
}</pre>
					</div>
				</div>
				<br class="example-break">
				<div class="example">
					<a name="connector-j-examples-autoincrement-updateable-resultsets"></a>
					<p class="title">
						<b>Example 6.10. Connector/J: Retrieving <code class="literal">AUTO_INCREMENT</code>
							column values in <code class="literal">Updatable
								ResultSets</code></b>
					</p>
					<div class="example-contents">
						<pre class="programlisting">   Statement stmt = null;
   ResultSet rs = null;
   try {
    //
    // Create a Statement instance that we can use for
    // 'normal' result sets as well as an 'updatable'
    // one, assuming you have a Connection 'conn' to
    // a MySQL database already available
    //
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_UPDATABLE);
    //
    // Issue the DDL queries for the table for this example
    //
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    //
    // Example of retrieving an AUTO INCREMENT key
    // from an updatable result set
    //
    rs = stmt.executeQuery("SELECT priKey, dataField "
       + "FROM autoIncTutorial");
    rs.moveToInsertRow();
    rs.updateString("dataField", "AUTO INCREMENT here?");
    rs.insertRow();
    //
    // the driver adds rows at the end
    //
    rs.last();
    //
    // We should now be on the row we just inserted
    //
    int autoIncKeyFromRS = rs.getInt("priKey");
    rs.close();
    rs = null;
    System.out.println("Key returned for inserted row: "
        + autoIncKeyFromRS);
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException ex) {
            // ignore
        }
    }
}</pre>
					</div>
				</div>
				<br class="example-break">
				<p>Running the preceding example code should produce the
					following output:</p>
				<pre class="programlisting">Key returned from getGeneratedKeys(): 1
Key returned from SELECT LAST_INSERT_ID(): 1
Key returned for inserted row: 2</pre>
				<p>
					At times, it can be tricky to use the
					<code class="literal">SELECT LAST_INSERT_ID()</code>
					query, as that function's value is scoped to a connection. So, if
					some other query happens on the same connection, the value is
					overwritten. On the other hand, the
					<code class="function">getGeneratedKeys()</code>
					method is scoped by the
					<code class="classname">Statement</code>
					instance, so it can be used even if other queries happen on the
					same connection, but not on the same
					<code class="classname">Statement</code>
					instance.
				</p>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-j2ee-concepts-connection-pooling"></a>Chapter 7. Connection
							Pooling with Connector/J
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id567537"></a><a class="indexterm"
				name="id567550"></a>
			<p>
				Connection pooling is a technique of creating and managing a pool of
				connections that are ready for use by any <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_thread"
					target="_top">thread</a> that needs them. Connection pooling can
				greatly increase the performance of your Java application, while
				reducing overall resource usage.
			</p>
			<h2>
				<a name="id567571"></a> How Connection Pooling Works
			</h2>
			<p>
				Most applications only need a thread to have access to a JDBC
				connection when they are actively processing a <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_transaction"
					target="_top">transaction</a>, which often takes only milliseconds
				to complete. When not processing a transaction, the connection sits
				idle. Connection pooling enables the idle connection to be used by
				some other thread to do useful work.
			</p>
			<p>In practice, when a thread needs to do work against a MySQL or
				other database with JDBC, it requests a connection from the pool.
				When the thread is finished using the connection, it returns it to
				the pool, so that it can be used by any other threads.</p>
			<p>
				When the connection is loaned out from the pool, it is used
				exclusively by the thread that requested it. From a programming
				point of view, it is the same as if your thread called
				<code class="literal">DriverManager.getConnection()</code>
				every time it needed a JDBC connection. With connection pooling,
				your thread may end up using either a new connection or an
				already-existing connection.
			</p>
			<h2>
				<a name="id567605"></a> Benefits of Connection Pooling
			</h2>
			<p>The main benefits to connection pooling are:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>Reduced connection creation time.
						</p>
						<p>Although this is not usually an issue with the quick
							connection setup that MySQL offers compared to other databases,
							creating new JDBC connections still incurs networking and JDBC
							driver overhead that will be avoided if connections are recycled.
						</p></li>
					<li class="listitem"><p>Simplified programming model.</p>
						<p>When using connection pooling, each individual thread can
							act as though it has created its own JDBC connection, allowing
							you to use straightforward JDBC programming techniques.</p></li>
					<li class="listitem"><p>Controlled resource usage.</p>
						<p>If you create a new connection every time a thread needs
							one, rather than using connection pooling, your application's
							resource usage can be wasteful and lead to unpredictable behavior
							under load.</p></li>
				</ul>
			</div>
			<h2>
				<a name="id567653"></a> Using Connection Pooling with Connector/J
			</h2>
			<p>Sun has standardized the concept of connection pooling in JDBC
				through the JDBC 2.0 Optional interfaces, and all major application
				servers have implementations of these APIs that work with MySQL
				Connector/J.</p>
			<p>Generally, you configure a connection pool in your application
				server configuration files, and access it through the Java Naming
				and Directory Interface (JNDI). The following code shows how you
				might use a connection pool from an application deployed in a J2EE
				application server:</p>
			<div class="example">
				<a name="connector-j-examples-connectionpool-j2ee"></a>
				<p class="title">
					<b>Example 7.1. Connector/J: Using a connection pool with a
						J2EE application server</b>
				</p>
				<div class="example-contents">
					<pre class="programlisting">import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MyServletJspOrEjb {
    public void doSomething() throws Exception {
        /*
         * Create a JNDI Initial context to be able to
         *  lookup  the DataSource
         *
         * In production-level code, this should be cached as
         * an instance or static variable, as it can
         * be quite expensive to create a JNDI context.
         *
         * Note: This code only works when you are using servlets
         * or EJBs in a J2EE application server. If you are
         * using connection pooling in standalone Java code, you
         * will have to create/configure datasources using whatever
         * mechanisms your particular connection pooling library
         * provides.
         */
        InitialContext ctx = new InitialContext();
         /*
          * Lookup the DataSource, which will be backed by a pool
          * that the application server provides. DataSource instances
          * are also a good candidate for caching as an instance
          * variable, as JNDI lookups can be expensive as well.
          */
        DataSource ds =
          (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");
        /*
         * The following code is what would actually be in your
         * Servlet, JSP or EJB 'service' method...where you need
         * to work with a JDBC connection.
         */
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = ds.getConnection();
            /*
             * Now, use normal JDBC programming to work with
             * MySQL, making sure to close each resource when you're
             * finished with it, which permits the connection pool
             * resources to be recovered as quickly as possible
             */
            stmt = conn.createStatement();
            stmt.execute("SOME SQL QUERY");
            stmt.close();
            stmt = null;
            conn.close();
            conn = null;
        } finally {
            /*
             * close any jdbc instances here that weren't
             * explicitly closed during normal code path, so
             * that we don't 'leak' resources...
             */
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (sqlexception sqlex) {
                    // ignore, as we can't do anything about it here
                }
                stmt = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (sqlexception sqlex) {
                    // ignore, as we can't do anything about it here
                }
                conn = null;
            }
        }
    }
}</pre>
				</div>
			</div>
			<p>
				<br class="example-break"> As shown in the example above, after
				obtaining the JNDI
				<code class="literal">InitialContext</code>
				, and looking up the
				<code class="literal">DataSource</code>
				, the rest of the code follows familiar JDBC conventions.
			</p>
			<p>When using connection pooling, always make sure that
				connections, and anything created by them (such as statements or
				result sets) are closed. This rule applies no matter what happens in
				your code (exceptions, flow-of-control, and so forth). When these
				objects are closed, they can be re-used; otherwise, they will be
				stranded, which means that the MySQL server resources they represent
				(such as buffers, locks, or sockets) are tied up for some time, or
				in the worst case can be tied up forever.</p>
			<h2>
				<a name="id567753"></a> Sizing the Connection Pool
			</h2>
			<p>Each connection to MySQL has overhead (memory, CPU, context
				switches, and so forth) on both the client and server side. Every
				connection limits how many resources there are available to your
				application as well as the MySQL server. Many of these resources
				will be used whether or not the connection is actually doing any
				useful work! Connection pools can be tuned to maximize performance,
				while keeping resource utilization below the point where your
				application will start to fail rather than just run slower.</p>
			<p>The optimal size for the connection pool depends on
				anticipated load and average database transaction time. In practice,
				the optimal connection pool size can be smaller than you might
				expect. If you take Sun's Java Petstore blueprint application for
				example, a connection pool of 15-20 connections can serve a
				relatively moderate load (600 concurrent users) using MySQL and
				Tomcat with acceptable response times.</p>
			<p>To correctly size a connection pool for your application,
				create load test scripts with tools such as Apache JMeter or The
				Grinder, and load test your application.</p>
			<p>An easy way to determine a starting point is to configure your
				connection pool's maximum number of connections to be unbounded, run
				a load test, and measure the largest amount of concurrently used
				connections. You can then work backward from there to determine what
				values of minimum and maximum pooled connections give the best
				performance for your particular application.</p>
			<h2>
				<a name="id567783"></a> Validating Connections
			</h2>
			<p>MySQL Connector/J can validate the connection by executing a
				lightweight ping against a server. In the case of load-balanced
				connections, this is performed against all active pooled internal
				connections that are retained. This is beneficial to Java
				applications using connection pools, as the pool can use this
				feature to validate connections. Depending on your connection pool
				and configuration, this validation can be carried out at different
				times:</p>
			<div class="orderedlist">
				<ol class="orderedlist" type="1">
					<li class="listitem"><p>Before the pool returns a
							connection to the application.</p></li>
					<li class="listitem"><p>When the application returns a
							connection to the pool.</p></li>
					<li class="listitem"><p>During periodic checks of idle
							connections.</p></li>
				</ol>
			</div>
			<p>
				To use this feature, specify a validation query in your connection
				pool that starts with
				<code class="literal">/* ping */</code>
				. Note that the syntax must be exactly as specified. This will cause
				the driver send a ping to the server and return a dummy lightweight
				result set. When using a
				<code class="literal">ReplicationConnection</code>
				or
				<code class="literal">LoadBalancedConnection</code>
				, the ping will be sent across all active connections.
			</p>
			<p>It is critical that the syntax be specified correctly. The
				syntax needs to be exact for reasons of efficiency, as this test is
				done for every statement that is executed:</p>
			<pre class="programlisting">
protected static final String PING_MARKER = "/* ping */";
...
if (sql.charAt(0) == '/') {
if (sql.startsWith(PING_MARKER)) {
doPingInstead();
...
</pre>
			<p>None of the following snippets will work, because the ping
				syntax is sensitive to whitespace, capitalization, and placement:</p>
			<pre class="programlisting">sql = "/* PING */ SELECT 1";
sql = "SELECT 1 /* ping*/";
sql = "/*ping*/ SELECT 1";
sql = " /* ping */ SELECT 1";
sql = "/*to ping or not to ping*/ SELECT 1";</pre>
			<p>
				All of the previous statements will issue a normal
				<code class="literal">SELECT</code>
				statement and will <span class="bold"><strong>not</strong></span> be
				transformed into the lightweight ping. Further, for load-balanced
				connections, the statement will be executed against one connection
				in the internal pool, rather than validating each underlying
				physical connection. This results in the non-active physical
				connections assuming a stale state, and they may die. If Connector/J
				then re-balances, it might select a dead connection, resulting in an
				exception being passed to the application. To help prevent this, you
				can use
				<code class="literal">loadBalanceValidateConnectionOnSwapServer</code>
				to validate the connection before use.
			</p>
			<p>
				If your Connector/J deployment uses a connection pool that allows
				you to specify a validation query, take advantage of it, but ensure
				that the query starts <span class="emphasis"><em>exactly</em></span>
				with
				<code class="literal">/* ping */</code>
				. This is particularly important if you are using the load-balancing
				or replication-aware features of Connector/J, as it will help keep
				alive connections which otherwise will go stale and die, causing
				problems later.
			</p>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a
								name="connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections"></a>Chapter 8. Load
							Balancing with Connector/J
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id567942"></a><a class="indexterm"
				name="id567955"></a>
			<p>Connector/J has long provided an effective means to distribute
				read/write load across multiple MySQL server instances for Cluster
				or master-master replication deployments. Starting with Connector/J
				5.1.3, you can now dynamically configure load-balanced connections,
				with no service outage. In-process transactions are not lost, and no
				application exceptions are generated if any application is trying to
				use that particular server instance.</p>
			<p>There are two connection string options associated with this
				functionality:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<code class="literal">loadBalanceConnectionGroup</code>
							– This provides the ability to group connections from different
							sources. This allows you to manage these JDBC sources within a
							single class loader in any combination you choose. If they use
							the same configuration, and you want to manage them as a logical
							single group, give them the same name. This is the key property
							for management: if you do not define a name (string) for
							<code class="literal">loadBalanceConnectionGroup</code>
							, you cannot manage the connections. All load-balanced
							connections sharing the same
							<code class="literal">loadBalanceConnectionGroup</code>
							value, regardless of how the application creates them, will be
							managed together.
						</p></li>
					<li class="listitem"><p>
							<code class="literal">loadBalanceEnableJMX</code>
							– The ability to manage the connections is exposed when you
							define a
							<code class="literal">loadBalanceConnectionGroup</code>
							, but if you want to manage this externally, enable JMX by
							setting this property to
							<code class="literal">true</code>
							. This enables a JMX implementation, which exposes the management
							and monitoring operations of a connection group. Further, start
							your application with the
							<code class="literal">-Dcom.sun.management.jmxremote</code>
							JVM flag. You can then perform connect and perform operations
							using a JMX client such as
							<code class="literal">jconsole</code>
							.
						</p></li>
				</ul>
			</div>
			<p>Once a connection has been made using the correct connection
				string options, a number of monitoring properties are available:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>Current active host count.</p></li>
					<li class="listitem"><p>Current active physical connection
							count.</p></li>
					<li class="listitem"><p>Current active logical connection
							count.</p></li>
					<li class="listitem"><p>Total logical connections created.
						</p></li>
					<li class="listitem"><p>Total transaction count.</p></li>
				</ul>
			</div>
			<p>The following management operations can also be performed:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>Add host.</p></li>
					<li class="listitem"><p>Remove host.</p></li>
				</ul>
			</div>
			<p>
				The JMX interface,
				<code class="literal">com.mysql.jdbc.jmx.LoadBalanceConnectionGroupManagerMBean</code>
				, has the following methods:
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<code class="literal">int getActiveHostCount(String
								group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">int getTotalHostCount(String group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">long
								getTotalLogicalConnectionCount(String group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">long
								getActiveLogicalConnectionCount(String group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">long
								getActivePhysicalConnectionCount(String group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">long
								getTotalPhysicalConnectionCount(String group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">long getTotalTransactionCount(String
								group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">void removeHost(String group, String
								host) throws SQLException;</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">void stopNewConnectionsToHost(String
								group, String host) throws SQLException;</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">void addHost(String group, String
								host, boolean forExisting);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">String getActiveHostsList(String
								group);</code>
						</p></li>
					<li class="listitem"><p>
							<code class="literal">String
								getRegisteredConnectionGroups();</code>
						</p></li>
				</ul>
			</div>
			<p>
				The
				<code class="literal">getRegisteredConnectionGroups()</code>
				method returns the names of all connection groups defined in that
				class loader.
			</p>
			<p>You can test this setup with the following code:</p>
			<pre class="programlisting">
public class Test {
    private static String URL = "jdbc:mysql:loadbalance://" +
        "localhost:3306,localhost:3310/test?" +
        "loadBalanceConnectionGroup=first&amp;loadBalanceEnableJMX=true";
    public static void main(String[] args) throws Exception {
        new Thread(new Repeater()).start();
        new Thread(new Repeater()).start();
        new Thread(new Repeater()).start();
    }
    static Connection getNewConnection() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection(URL, "root", "");
    }
    static void executeSimpleTransaction(Connection c, int conn, int trans){
        try {
            c.setAutoCommit(false);
            Statement s = c.createStatement();
            s.executeQuery("SELECT SLEEP(1) /* Connection: " + conn + ", transaction: " + trans + " */");
            c.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static class Repeater implements Runnable {
        public void run() {
            for(int i=0; i &lt; 100; i++){
                try {
                    Connection c = getNewConnection();
                    for(int j=0; j &lt; 10; j++){
                        executeSimpleTransaction(c, i, j);
                        Thread.sleep(Math.round(100 * Math.random()));
                    }
                    c.close();
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
</pre>
			<p>
				After compiling, the application can be started with the
				<code class="literal">-Dcom.sun.management.jmxremote</code>
				flag, to enable remote management.
				<code class="literal">jconsole</code>
				can then be started. The
				<code class="literal">Test</code>
				main class will be listed by
				<code class="literal">jconsole</code>
				. Select this and click <span class="guibutton">Connect</span>. You
				can then navigate to the
				<code class="literal">com.mysql.jdbc.jmx.LoadBalanceConnectionGroupManager</code>
				bean. At this point, you can click on various operations and examine
				the returned result.
			</p>
			<p>
				If you now had an additional instance of MySQL running on port 3309,
				you could ensure that Connector/J starts using it by using the
				<code class="literal">addHost()</code>
				, which is exposed in
				<code class="literal">jconsole</code>
				. Note that these operations can be performed dynamically without
				having to stop the application running.
			</p>
			<p>
				For further information on the combination of load balancing and
				failover, see <a class="xref"
					href="#connector-j-usagenotes-j2ee-concepts-load-balancing-failover"
					title="Chapter 9. Failover with Connector/J">Chapter 9, <i>Failover
						with Connector/J</i></a>.
			</p>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a
								name="connector-j-usagenotes-j2ee-concepts-load-balancing-failover"></a>Chapter 9. Failover
							with Connector/J
						</h1>
					</div>
				</div>
			</div>
			<p>
				Connector/J provides a useful load-balancing implementation for
				Cluster or multi-master deployments, as explained in <a class="xref"
					href="#connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections"
					title="Chapter 8. Load Balancing with Connector/J">Chapter 8, <i>Load
						Balancing with Connector/J</i></a>. As of Connector/J 5.1.12, this same
				implementation is used for balancing load between read-only slaves
				with
				<code class="literal">ReplicationDriver</code>
				. When trying to balance workload between multiple servers, the
				driver has to determine when it is safe to swap servers, doing so in
				the middle of a transaction, for example, could cause problems. It
				is important not to lose state information. For this reason,
				Connector/J will only try to pick a new server when one of the
				following happens:
			</p>
			<div class="orderedlist">
				<ol class="orderedlist" type="1">
					<li class="listitem"><p>At transaction boundaries
							(transactions are explicitly committed or rolled back).</p></li>
					<li class="listitem"><p>A communication exception (SQL
							State starting with "08") is encountered.</p></li>
					<li class="listitem"><p>
							When a
							<code class="literal">SQLException</code>
							matches conditions defined by user, using the extension points
							defined by the
							<code class="literal">loadBalanceSQLStateFailover</code>
							,
							<code class="literal">loadBalanceSQLExceptionSubclassFailover</code>
							or
							<code class="literal">loadBalanceExceptionChecker</code>
							properties.
						</p></li>
				</ol>
			</div>
			<p>
				The third condition revolves around three new properties introduced
				with Connector/J 5.1.13. It allows you to control which
				<code class="literal">SQLException</code>
				s trigger failover.
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<code class="literal">loadBalanceExceptionChecker</code>
							- The
							<code class="literal">loadBalanceExceptionChecker</code>
							property is really the key. This takes a fully-qualified class
							name which implements the new
							<code class="literal">com.mysql.jdbc.LoadBalanceExceptionChecker</code>
							interface. This interface is very simple, and you only need to
							implement the following method:
						</p>
						<pre class="programlisting">public boolean shouldExceptionTriggerFailover(SQLException ex)</pre>
						<p>
							A
							<code class="literal">SQLException</code>
							is passed in, and a boolean returned. A value of
							<code class="literal">true</code>
							triggers a failover,
							<code class="literal">false</code>
							does not.
						</p>
						<p>You can use this to implement your own custom logic. An
							example where this might be useful is when dealing with transient
							errors when using MySQL Cluster, where certain buffers may become
							overloaded. The following code snippet illustrates this:</p>
						<pre class="programlisting">
public class NdbLoadBalanceExceptionChecker
 extends StandardLoadBalanceExceptionChecker {
 public boolean shouldExceptionTriggerFailover(SQLException ex) {
  return super.shouldExceptionTriggerFailover(ex)
    ||  checkNdbException(ex);
 }
 private boolean checkNdbException(SQLException ex){
 // Have to parse the message since most NDB errors
 // are mapped to the same DEMC.
  return (ex.getMessage().startsWith("Lock wait timeout exceeded") ||
  (ex.getMessage().startsWith("Got temporary error")
  &amp;&amp; ex.getMessage().endsWith("from NDB")));
 }
}
</pre>
						<p>
							The code above extends
							<code class="literal">com.mysql.jdbc.StandardLoadBalanceExceptionChecker</code>
							, which is the default implementation. There are a few convenient
							shortcuts built into this, for those who want to have some level
							of control using properties, without writing Java code. This
							default implementation uses the two remaining properties:
							<code class="literal">loadBalanceSQLStateFailover</code>
							and
							<code class="literal">loadBalanceSQLExceptionSubclassFailover</code>
							.
						</p></li>
					<li class="listitem"><p>
							<code class="literal">loadBalanceSQLStateFailover</code>
							- allows you to define a comma-delimited list of
							<code class="literal">SQLState</code>
							code prefixes, against which a
							<code class="literal">SQLException</code>
							is compared. If the prefix matches, failover is triggered. So,
							for example, the following would trigger a failover if a given
							<code class="literal">SQLException</code>
							starts with "00", or is "12345":
						</p>
						<pre class="programlisting">loadBalanceSQLStateFailover=00,12345</pre></li>
					<li class="listitem"><p>
							<code class="literal">loadBalanceSQLExceptionSubclassFailover</code>
							- can be used in conjunction with
							<code class="literal">loadBalanceSQLStateFailover</code>
							or on its own. If you want certain subclasses of
							<code class="literal">SQLException</code>
							to trigger failover, simply provide a comma-delimited list of
							fully-qualified class or interface names to check against. For
							example, if you want all
							<code class="literal">SQLTransientConnectionExceptions</code>
							to trigger failover, you would specify:
						</p>
						<pre class="programlisting">loadBalanceSQLExceptionSubclassFailover=java.sql.SQLTransientConnectionException</pre></li>
				</ul>
			</div>
			<p>
				While the three fail-over conditions enumerated earlier suit most
				situations, if
				<code class="literal">auto-commit</code>
				is enabled, Connector/J never re-balances, and continues using the
				same physical connection. This can be problematic, particularly when
				load-balancing is being used to distribute read-only load across
				multiple slaves. However, Connector/J can be configured to
				re-balance after a certain number of statements are executed, when
				<code class="literal">auto-commit</code>
				is enabled. This functionality is dependent upon the following
				properties:
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<code class="literal">loadBalanceAutoCommitStatementThreshold</code>
							– defines the number of matching statements which will trigger
							the driver to potentially swap physical server connections. The
							default value, 0, retains the behavior that connections with
							<code class="literal">auto-commit</code>
							enabled are never balanced.
						</p></li>
					<li class="listitem"><p>
							<code class="literal">loadBalanceAutoCommitStatementRegex</code>
							– the regular expression against which statements must match. The
							default value, blank, matches all statements. So, for example,
							using the following properties will cause Connector/J to
							re-balance after every third statement that contains the string <span
								class="quote">“<span class="quote">test</span>”
							</span>:
						</p>
						<pre class="programlisting">loadBalanceAutoCommitStatementThreshold=3
loadBalanceAutoCommitStatementRegex=.*test.*</pre>
						<p>
							<code class="literal">loadBalanceAutoCommitStatementRegex</code>
							can prove useful in a number of situations. Your application may
							use temporary tables, server-side session state variables, or
							connection state, where letting the driver arbitrarily swap
							physical connections before processing is complete could cause
							data loss or other problems. This allows you to identify a
							trigger statement that is only executed when it is safe to swap
							physical connections.
						</p></li>
				</ul>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-interceptors"></a>Chapter 10. Using the
							Connector/J Interceptor Classes
						</h1>
					</div>
				</div>
			</div>
			<p>An interceptor is a software design pattern that provides a
				transparent way to extend or modify some aspect of a program,
				similar to a user exit. No recompiling is required. With
				Connector/J, the interceptors are enabled and disabled by updating
				the connection string to refer to different sets of interceptor
				classes that you instantiate.</p>
			<p>
				The connection properties that control the interceptors are
				explained in <a class="xref"
					href="#connector-j-reference-configuration-properties"
					title="5.1. Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J">Section 5.1,
					“Driver/Datasource Class Names, URL Syntax and Configuration
					Properties for Connector/J”</a>:
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<code class="literal">connectionLifecycleInterceptors</code>
							, where you specify the fully qualified names of classes that
							implement the
							<code class="literal">com.mysql.jdbc.ConnectionLifecycleInterceptor</code>
							interface. In these kinds of interceptor classes, you might log
							events such as rollbacks, measure the time between transaction
							start and end, or count events such as calls to
							<code class="literal">setAutoCommit()</code>
							.
						</p></li>
					<li class="listitem"><p>
							<code class="literal">exceptionInterceptors</code>
							, where you specify the fully qualified names of classes that
							implement the
							<code class="literal">com.mysql.jdbc.ExceptionInterceptor</code>
							interface. In these kinds of interceptor classes, you might add
							extra diagnostic information to exceptions that can have multiple
							causes or indicate a problem with server settings. Because
							<code class="literal">exceptionInterceptors</code>
							classes are only called when handling a
							<code class="literal">SQLException</code>
							thrown from Connector/J code, they can be used even in production
							deployments without substantial performance overhead.
						</p></li>
					<li class="listitem"><p>
							<code class="literal">statementInterceptors</code>
							, where you specify the fully qualified names of classes that
							implement the
							<code class="literal">com.mysql.jdbc.StatementInterceptorV2</code>
							interface. In these kinds of interceptor classes, you might
							change or augment the processing done by certain kinds of
							statements, such as automatically checking for queried data in a
							<span class="command"><strong>memcached</strong></span> server,
							rewriting slow queries, logging information about statement
							execution, or route requests to remote servers.
						</p></li>
				</ul>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-tomcat"></a>Chapter 11. Using
							Connector/J with Tomcat
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id568940"></a>
			<p>
				The following instructions are based on the instructions for
				Tomcat-5.x, available at <a class="ulink"
					href="http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html"
					target="_top">http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html</a>
				which is current at the time this document was written.
			</p>
			<p>
				First, install the
				<code class="filename">.jar</code>
				file that comes with Connector/J in
				<code class="filename">$CATALINA_HOME/common/lib</code>
				so that it is available to all applications installed in the
				container.
			</p>
			<p>
				Next, configure the JNDI DataSource by adding a declaration resource
				to
				<code class="filename">$CATALINA_HOME/conf/server.xml</code>
				in the context that defines your web application:
			</p>
			<pre class="programlisting">  &lt;Context ....&gt;
  ...
  &lt;Resource name="jdbc/MySQLDB"
               auth="Container"
               type="javax.sql.DataSource"/&gt;
  &lt;ResourceParams name="jdbc/MySQLDB"&gt;
    &lt;parameter&gt;
      &lt;name&gt;factory&lt;/name&gt;
      &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;maxActive&lt;/name&gt;
      &lt;value&gt;10&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;maxIdle&lt;/name&gt;
      &lt;value&gt;5&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;validationQuery&lt;/name&gt;
      &lt;value&gt;SELECT 1&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;testOnBorrow&lt;/name&gt;
      &lt;value&gt;true&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;testWhileIdle&lt;/name&gt;
      &lt;value&gt;true&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;timeBetweenEvictionRunsMillis&lt;/name&gt;
      &lt;value&gt;10000&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;minEvictableIdleTimeMillis&lt;/name&gt;
      &lt;value&gt;60000&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
     &lt;name&gt;username&lt;/name&gt;
     &lt;value&gt;someuser&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
     &lt;name&gt;password&lt;/name&gt;
     &lt;value&gt;somepass&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
       &lt;name&gt;driverClassName&lt;/name&gt;
       &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;
    &lt;/parameter&gt;
    &lt;parameter&gt;
      &lt;name&gt;url&lt;/name&gt;
      &lt;value&gt;jdbc:mysql://localhost:3306/test&lt;/value&gt;
    &lt;/parameter&gt;
  &lt;/ResourceParams&gt;
&lt;/Context&gt;</pre>
			<p>
				Note that Connector/J 5.1.3 introduced a facility whereby, rather
				than use a
				<code class="literal">validationQuery</code>
				value of
				<code class="literal">SELECT 1</code>
				, it is possible to use
				<code class="literal">validationQuery</code>
				with a value set to
				<code class="literal">/* ping */</code>
				. This sends a ping to the server which then returns a fake result
				set. This is a lighter weight solution. It also has the advantage
				that if using
				<code class="literal">ReplicationConnection</code>
				or
				<code class="literal">LoadBalancedConnection</code>
				type connections, the ping will be sent across all active
				connections. The following XML snippet illustrates how to select
				this option:
			</p>
			<pre class="programlisting">
&lt;parameter&gt;
 &lt;name&gt;validationQuery&lt;/name&gt;
 &lt;value&gt;/* ping */&lt;/value&gt;
&lt;/parameter&gt;
</pre>
			<p>
				Note that
				<code class="literal">/* ping */</code>
				has to be specified exactly.
			</p>
			<p>In general, follow the installation instructions that come
				with your version of Tomcat, as the way you configure datasources in
				Tomcat changes from time to time, and if you use the wrong syntax in
				your XML file, you will most likely end up with an exception similar
				to the following:</p>
			<pre class="programlisting">Error: java.sql.SQLException: Cannot load JDBC driver class 'null ' SQL
state: null </pre>
			<p>
				Note that the auto-loading of drivers having the
				<code class="filename">META-INF/service/java.sql.Driver</code>
				class in JDBC 4.0 causes an improper undeployment of the Connector/J
				driver in Tomcat on Windows. Namely, the Connector/J jar remains
				locked. This is an initialization problem that is not related to the
				driver. The possible workarounds, if viable, are as follows: use "
				<code class="literal">antiResourceLocking=true</code>
				" as a Tomcat Context attribute, or remove the
				<code class="filename">META-INF/</code>
				directory.
			</p>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-jboss"></a>Chapter 12. Using
							Connector/J with JBoss
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id569136"></a>
			<p>
				These instructions cover JBoss-4.x. To make the JDBC driver classes
				available to the application server, copy the
				<code class="filename">.jar</code>
				file that comes with Connector/J to the
				<code class="filename">lib</code>
				directory for your server configuration (which is usually called
				<code class="filename">default</code>
				). Then, in the same configuration directory, in the subdirectory
				named deploy, create a datasource configuration file that ends with
				<code class="literal">-ds.xml</code>
				, which tells JBoss to deploy this file as a JDBC Datasource. The
				file should have the following contents:
			</p>
			<pre class="programlisting">&lt;datasources&gt;
    &lt;local-tx-datasource&gt;
        &lt;jndi-name&gt;MySQLDB&lt;/jndi-name&gt;
        &lt;connection-url&gt;jdbc:mysql://localhost:3306/dbname&lt;/connection-url&gt;
        &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;
        &lt;user-name&gt;user&lt;/user-name&gt;
        &lt;password&gt;pass&lt;/password&gt;
        &lt;min-pool-size&gt;5&lt;/min-pool-size&gt;
        &lt;max-pool-size&gt;20&lt;/max-pool-size&gt;
        &lt;idle-timeout-minutes&gt;5&lt;/idle-timeout-minutes&gt;
        &lt;exception-sorter-class-name&gt;
  com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
        &lt;/exception-sorter-class-name&gt;
        &lt;valid-connection-checker-class-name&gt;
  com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker
        &lt;/valid-connection-checker-class-name&gt;
    &lt;/local-tx-datasource&gt;
&lt;/datasources&gt; </pre>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-spring-config"></a>Chapter 13. Using
							Connector/J with Spring
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-spring-config-jdbctemplate">13.1.
								Using <code class="classname">JdbcTemplate</code>
						</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-spring-config-transactional">13.2.
								Transactional JDBC Access</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-spring-config-connpooling">13.3.
								Connection Pooling with Spring</a></span>
					</dt>
				</dl>
			</div>
			<a class="indexterm" name="id569218"></a>
			<p>
				The Spring Framework is a Java-based application framework designed
				for assisting in application design by providing a way to configure
				components. The technique used by Spring is a well known design
				pattern called Dependency Injection (see <a class="ulink"
					href="http://www.martinfowler.com/articles/injection.html"
					target="_top">Inversion of Control Containers and the
					Dependency Injection pattern</a>). This article will focus on
				Java-oriented access to MySQL databases with Spring 2.0. For those
				wondering, there is a .NET port of Spring appropriately named
				Spring.NET.
			</p>
			<p>Spring is not only a system for configuring components, but
				also includes support for aspect oriented programming (AOP). This is
				one of the main benefits and the foundation for Spring's resource
				and transaction management. Spring also provides utilities for
				integrating resource management with JDBC and Hibernate.</p>
			<p>
				For the examples in this section the MySQL world sample database
				will be used. The first task is to set up a MySQL data source
				through Spring. Components within Spring use the <span class="quote">“<span
					class="quote">bean</span>”
				</span> terminology. For example, to configure a connection to a MySQL
				server supporting the world sample database, you might use:
			</p>
			<pre class="programlisting">
&lt;util:map id="dbProps"&gt;
    &lt;entry key="db.driver" value="com.mysql.jdbc.Driver"/&gt;
    &lt;entry key="db.jdbcurl" value="jdbc:mysql://localhost/world"/&gt;
    &lt;entry key="db.username" value="myuser"/&gt;
    &lt;entry key="db.password" value="mypass"/&gt;
&lt;/util:map&gt;
</pre>
			<p>In the above example, we are assigning values to properties
				that will be used in the configuration. For the datasource
				configuration:</p>
			<pre class="programlisting">
&lt;bean id="dataSource"
       class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
    &lt;property name="driverClassName" value="${db.driver}"/&gt;
    &lt;property name="url" value="${db.jdbcurl}"/&gt;
    &lt;property name="username" value="${db.username}"/&gt;
    &lt;property name="password" value="${db.password}"/&gt;
&lt;/bean&gt;
</pre>
			<p>The placeholders are used to provide values for properties of
				this bean. This means that you can specify all the properties of the
				configuration in one place instead of entering the values for each
				property on each bean. We do, however, need one more bean to pull
				this all together. The last bean is responsible for actually
				replacing the placeholders with the property values.</p>
			<pre class="programlisting">
&lt;bean
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;
    &lt;property name="properties" ref="dbProps"/&gt;
&lt;/bean&gt;
</pre>
			<p>Now that we have our MySQL data source configured and ready to
				go, we write some Java code to access it. The example below will
				retrieve three random cities and their corresponding country using
				the data source we configured with Spring.</p>
			<pre class="programlisting">// Create a new application context. this processes the Spring config
ApplicationContext ctx =
    new ClassPathXmlApplicationContext("ex1appContext.xml");
// Retrieve the data source from the application context
    DataSource ds = (DataSource) ctx.getBean("dataSource");
// Open a database connection using Spring's DataSourceUtils
Connection c = DataSourceUtils.getConnection(ds);
try {
    // retrieve a list of three random cities
    PreparedStatement ps = c.prepareStatement(
        "select City.Name as 'City', Country.Name as 'Country' " +
        "from City inner join Country on City.CountryCode = Country.Code " +
        "order by rand() limit 3");
    ResultSet rs = ps.executeQuery();
    while(rs.next()) {
        String city = rs.getString("City");
        String country = rs.getString("Country");
        System.out.printf("The city %s is in %s%n", city, country);
    }
} catch (SQLException ex) {
    // something has failed and we print a stack trace to analyse the error
    ex.printStackTrace();
    // ignore failure closing connection
    try { c.close(); } catch (SQLException e) { }
} finally {
    // properly release our connection
    DataSourceUtils.releaseConnection(c, ds);
}</pre>
			<p>This is very similar to normal JDBC access to MySQL with the
				main difference being that we are using DataSourceUtils instead of
				the DriverManager to create the connection.</p>
			<p>While it may seem like a small difference, the implications
				are somewhat far reaching. Spring manages this resource in a way
				similar to a container managed data source in a J2EE application
				server. When a connection is opened, it can be subsequently accessed
				in other parts of the code if it is synchronized with a transaction.
				This makes it possible to treat different parts of your application
				as transactional instead of passing around a database connection.</p>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-spring-config-jdbctemplate"></a>13.1. Using
								<code class="classname">JdbcTemplate</code>
							</h2>
						</div>
					</div>
				</div>
				<p>
					Spring makes extensive use of the Template method design pattern
					(see <a class="ulink"
						href="http://en.wikipedia.org/wiki/Template_method_pattern"
						target="_top">Template Method Pattern</a>). Our immediate focus
					will be on the
					<code class="literal">JdbcTemplate</code>
					and related classes, specifically
					<code class="literal">NamedParameterJdbcTemplate</code>
					. The template classes handle obtaining and releasing a connection
					for data access when one is needed.
				</p>
				<p>
					The next example shows how to use
					<code class="literal">NamedParameterJdbcTemplate</code>
					inside of a DAO (Data Access Object) class to retrieve a random
					city given a country code.
				</p>
				<pre class="programlisting">public class Ex2JdbcDao {
     /**
     * Data source reference which will be provided by Spring.
     */
     private DataSource dataSource;
     /**
     * Our query to find a random city given a country code. Notice
     * the ":country" parameter toward the end. This is called a
     * named parameter.
     */
     private String queryString = "select Name from City " +
        "where CountryCode = :country order by rand() limit 1";
     /**
     * Retrieve a random city using Spring JDBC access classes.
     */
     public String getRandomCityByCountryCode(String cntryCode) {
         // A template that permits using queries with named parameters
         NamedParameterJdbcTemplate template =
         new NamedParameterJdbcTemplate(dataSource);
         // A java.util.Map is used to provide values for the parameters
         Map params = new HashMap();
         params.put("country", cntryCode);
         // We query for an Object and specify what class we are expecting
         return (String)template.queryForObject(queryString, params, String.class);
     }
    /**
    * A JavaBean setter-style method to allow Spring to inject the data source.
    * @param dataSource
    */
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}</pre>
				<p>
					The focus in the above code is on the
					<code class="function">getRandomCityByCountryCode()</code>
					method. We pass a country code and use the
					<code class="literal">NamedParameterJdbcTemplate</code>
					to query for a city. The country code is placed in a Map with the
					key "country", which is the parameter is named in the SQL query.
				</p>
				<p>To access this code, you need to configure it with Spring by
					providing a reference to the data source.</p>
				<pre class="programlisting">
&lt;bean id="dao" class="code.Ex2JdbcDao"&gt;
    &lt;property name="dataSource" ref="dataSource"/&gt;
&lt;/bean&gt;
</pre>
				<p>
					At this point, we can just grab a reference to the DAO from Spring
					and call
					<code class="function">getRandomCityByCountryCode()</code>
					.
				</p>
				<pre class="programlisting">    // Create the application context
    ApplicationContext ctx =
    new ClassPathXmlApplicationContext("ex2appContext.xml");
    // Obtain a reference to our DAO
    Ex2JdbcDao dao = (Ex2JdbcDao) ctx.getBean("dao");
    String countryCode = "USA";
    // Find a few random cities in the US
    for(int i = 0; i &lt; 4; ++i)
        System.out.printf("A random city in %s is %s%n", countryCode,
            dao.getRandomCityByCountryCode(countryCode));</pre>
				<p>
					This example shows how to use Spring's JDBC classes to completely
					abstract away the use of traditional JDBC classes including
					<code class="literal">Connection</code>
					and
					<code class="literal">PreparedStatement</code>
					.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-spring-config-transactional"></a>13.2. Transactional
								JDBC Access
							</h2>
						</div>
					</div>
				</div>
				<p>You might be wondering how we can add transactions into our
					code if we do not deal directly with the JDBC classes. Spring
					provides a transaction management package that not only replaces
					JDBC transaction management, but also enables declarative
					transaction management (configuration instead of code).</p>
				<p>To use transactional database access, we will need to change
					the storage engine of the tables in the world database. The
					downloaded script explicitly creates MyISAM tables which do not
					support transactional semantics. The InnoDB storage engine does
					support transactions and this is what we will be using. We can
					change the storage engine with the following statements.</p>
				<pre class="programlisting">ALTER TABLE City ENGINE=InnoDB;
ALTER TABLE Country ENGINE=InnoDB;
ALTER TABLE CountryLanguage ENGINE=InnoDB;</pre>
				<p>A good programming practice emphasized by Spring is
					separating interfaces and implementations. What this means is that
					we can create a Java interface and only use the operations on this
					interface without any internal knowledge of what the actual
					implementation is. We will let Spring manage the implementation and
					with this it will manage the transactions for our implementation.</p>
				<p>First you create a simple interface:</p>
				<pre class="programlisting">public interface Ex3Dao {
    Integer createCity(String name, String countryCode,
    String district, Integer population);
}</pre>
				<p>This interface contains one method that will create a new
					city record in the database and return the id of the new record.
					Next you need to create an implementation of this interface.</p>
				<pre class="programlisting">public class Ex3DaoImpl implements Ex3Dao {
    protected DataSource dataSource;
    protected SqlUpdate updateQuery;
    protected SqlFunction idQuery;
    public Integer createCity(String name, String countryCode,
        String district, Integer population) {
            updateQuery.update(new Object[] { name, countryCode,
                   district, population });
            return getLastId();
        }
    protected Integer getLastId() {
        return idQuery.run();
    }
}</pre>
				<p>You can see that we only operate on abstract query objects
					here and do not deal directly with the JDBC API. Also, this is the
					complete implementation. All of our transaction management will be
					dealt with in the configuration. To get the configuration started,
					we need to create the DAO.</p>
				<pre class="programlisting">
&lt;bean id="dao" class="code.Ex3DaoImpl"&gt;
    &lt;property name="dataSource" ref="dataSource"/&gt;
    &lt;property name="updateQuery"&gt;...&lt;/property&gt;
    &lt;property name="idQuery"&gt;...&lt;/property&gt;
&lt;/bean&gt;
</pre>
				<p>
					Now you need to set up the transaction configuration. The first
					thing you must do is create transaction manager to manage the data
					source and a specification of what transaction properties are
					required for the
					<code class="literal">dao</code>
					methods.
				</p>
				<pre class="programlisting">
&lt;bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
    &lt;property name="dataSource" ref="dataSource"/&gt;
&lt;/bean&gt;
&lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt;
    &lt;tx:attributes&gt;
        &lt;tx:method name="*"/&gt;
    &lt;/tx:attributes&gt;
&lt;/tx:advice&gt;
</pre>
				<p>
					The preceding code creates a transaction manager that handles
					transactions for the data source provided to it. The
					<code class="literal">txAdvice</code>
					uses this transaction manager and the attributes specify to create
					a transaction for all methods. Finally you need to apply this
					advice with an AOP pointcut.
				</p>
				<pre class="programlisting">
&lt;aop:config&gt;
    &lt;aop:pointcut id="daoMethods"
        expression="execution(* code.Ex3Dao.*(..))"/&gt;
     &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/&gt;
&lt;/aop:config&gt;
</pre>
				<p>
					This basically says that all methods called on the
					<code class="literal">Ex3Dao</code>
					interface will be wrapped in a transaction. To make use of this,
					you only have to retrieve the
					<code class="literal">dao</code>
					from the application context and call a method on the
					<code class="literal">dao</code>
					instance.
				</p>
				<pre class="programlisting">Ex3Dao dao = (Ex3Dao) ctx.getBean("dao");
Integer id = dao.createCity(name,  countryCode, district, pop);</pre>
				<p>We can verify from this that there is no transaction
					management happening in our Java code and it is all configured with
					Spring. This is a very powerful notion and regarded as one of the
					most beneficial features of Spring.</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-spring-config-connpooling"></a>13.3. Connection
								Pooling with Spring
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id569628"></a>
				<p>
					In many situations, such as web applications, there will be a large
					number of small database transactions. When this is the case, it
					usually makes sense to create a pool of database connections
					available for web requests as needed. Although MySQL does not spawn
					an extra process when a connection is made, there is still a small
					amount of overhead to create and set up the connection. Pooling of
					connections also alleviates problems such as collecting large
					amounts of sockets in the
					<code class="literal">TIME_WAIT</code>
					state.
				</p>
				<p>
					Setting up pooling of MySQL connections with Spring is as simple as
					changing the data source configuration in the application context.
					There are a number of configurations that we can use. The first
					example is based on the <a class="ulink"
						href="http://jakarta.apache.org/commons/dbcp/" target="_top">Jakarta
						Commons DBCP library</a>. The example below replaces the source
					configuration that was based on
					<code class="literal">DriverManagerDataSource</code>
					with DBCP's BasicDataSource.
				</p>
				<pre class="programlisting">
&lt;bean id="dataSource" destroy-method="close"
  class="org.apache.commons.dbcp.BasicDataSource"&gt;
    &lt;property name="driverClassName" value="${db.driver}"/&gt;
    &lt;property name="url" value="${db.jdbcurl}"/&gt;
    &lt;property name="username" value="${db.username}"/&gt;
    &lt;property name="password" value="${db.password}"/&gt;
    &lt;property name="initialSize" value="3"/&gt;
&lt;/bean&gt;
</pre>
				<p>
					The configuration of the two solutions is very similar. The
					difference is that DBCP will pool connections to the database
					instead of creating a new connection every time one is requested.
					We have also set a parameter here called
					<code class="literal">initialSize</code>
					. This tells DBCP that we want three connections in the pool when
					it is created.
				</p>
				<p>
					Another way to configure connection pooling is to configure a data
					source in our J2EE application server. Using JBoss as an example,
					you can set up the MySQL connection pool by creating a file called
					<code class="filename">mysql-local-ds.xml</code>
					and placing it in the server/default/deploy directory in JBoss.
					Once we have this setup, we can use JNDI to look it up. With
					Spring, this lookup is very simple. The data source configuration
					looks like this.
				</p>
				<pre class="programlisting">
&lt;jee:jndi-lookup id="dataSource" jndi-name="java:MySQL_DS"/&gt;
</pre>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-glassfish-config"></a>Chapter 14. Using
							Connector/J with GlassFish
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-glassfish-config-jsp">14.1. A
								Simple JSP Application with Glassfish, Connector/J and MySQL</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-usagenotes-glassfish-config-servlet">14.2.
								A Simple Servlet with Glassfish, Connector/J and MySQL</a></span>
					</dt>
				</dl>
			</div>
			<a class="indexterm" name="id569746"></a><a class="indexterm"
				name="id569755"></a>
			<p>
				This section explains how to use MySQL Connector/J with Glassfish ™
				Server Open Source Edition 3.0.1. Glassfish can be downloaded from
				the <a class="ulink"
					href="https://glassfish.dev.java.net/public/downloadsindex.html#top"
					target="_top">Glassfish website</a>.
			</p>
			<p>
				Once Glassfish is installed you will need to make sure it can access
				MySQL Connector/J. To do this copy the MySQL Connector/J JAR file to
				the directory
				<code class="filename">
					<em class="replaceable"><code>GLASSFISH_INSTALL</code></em>/glassfish/lib
				</code>
				. For example, copy
				<code class="filename">mysql-connector-java-5.1.12-bin.jar</code>
				to
				<code class="filename">C:\glassfishv3\glassfish\lib</code>
				. Restart the Glassfish Application Server.
			</p>
			<p>You are now ready to create JDBC Connection Pools and JDBC
				Resources.</p>
			<p>
				<span class="bold"><strong>Creating a Connection
						Pool</strong></span>
			</p>
			<div class="orderedlist">
				<ol class="orderedlist" type="1">
					<li class="listitem"><p>
							In the Glassfish Administration Console, using the navigation
							tree navigate to <span class="guilabel">Resources</span>, <span
								class="guilabel">JDBC</span>, <span class="guilabel">Connection
								Pools</span>.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">JDBC Connection Pools</span> frame
							click <span class="guibutton">New</span>. You will enter a two
							step wizard.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">Name</span> field under <span
								class="guilabel">General Settings</span> enter the name for the
							connection pool, for example enter <strong class="userinput"><code>MySQLConnPool</code></strong>.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">Resource Type</span> field, select
							<code class="literal">javax.sql.DataSource</code>
							from the drop-down listbox.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">Database Vendor</span> field,
							select
							<code class="literal">MySQL</code>
							from the drop-down listbox. Click <span class="guibutton">Next</span>
							to go to the next page of the wizard.
						</p></li>
					<li class="listitem"><p>You can accept the default
							settings for General Settings, Pool Settings and Transactions for
							this example. Scroll down to Additional Properties.</p></li>
					<li class="listitem"><p>In Additional Properties you will
							need to ensure the following properties are set:</p>
						<div class="itemizedlist">
							<ul class="itemizedlist" style="list-style-type: disc;">
								<li class="listitem"><p>
										<span class="bold"><strong>ServerName</strong></span> - The
										server to connect to. For local testing this will be
										<code class="literal">localhost</code>
										.
									</p></li>
								<li class="listitem"><p>
										<span class="bold"><strong>User</strong></span> - The user
										name with which to connect to MySQL.
									</p></li>
								<li class="listitem"><p>
										<span class="bold"><strong>Password</strong></span> - The
										corresponding password for the user.
									</p></li>
								<li class="listitem"><p>
										<span class="bold"><strong>DatabaseName</strong></span> - The
										database to connect to, for example the sample MySQL database
										<code class="literal">World</code>
										.
									</p></li>
							</ul>
						</div></li>
					<li class="listitem"><p>
							Click <span class="guibutton">Finish</span> to exit the wizard.
							You will be taken to the <span class="guilabel">JDBC
								Connection Pools</span> page where all current connection pools,
							including the one you just created, will be displayed.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">JDBC Connection Pools</span> frame
							click on the connection pool you just created. Here you can
							review and edit information about the connection pool.
						</p></li>
					<li class="listitem"><p>
							To test your connection pool click the <span class="guibutton">Ping</span>
							button at the top of the frame. A message will be displayed
							confirming correct operation or otherwise. If an error message is
							received recheck the previous steps, and ensure that MySQL
							Connector/J has been correctly copied into the previously
							specified location.
						</p></li>
				</ol>
			</div>
			<p>Now that you have created a connection pool you will also need
				to create a JDBC Resource (data source) for use by your application.
			</p>
			<p>
				<span class="bold"><strong>Creating a JDBC Resource</strong></span>
			</p>
			<p>Your Java application will usually reference a data source
				object to establish a connection with the database. This needs to be
				created first using the following procedure.</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							Using the navigation tree in the Glassfish Administration
							Console, navigate to <span class="guilabel">Resources</span>, <span
								class="guilabel">JDBC</span>, <span class="guilabel">JDBC
								Resources</span>. A list of resources will be displayed in the <span
								class="guilabel">JDBC Resources</span> frame.
						</p></li>
					<li class="listitem"><p>
							Click <span class="guibutton">New</span>. The <span
								class="guilabel">New JDBC Resource</span> frame will be
							displayed.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">JNDI Name</span> field, enter the
							JNDI name that will be used to access this resource, for example
							enter <strong class="userinput"><code>jdbc/MySQLDataSource</code></strong>.
						</p></li>
					<li class="listitem"><p>
							In the <span class="guilabel">Pool Name</span> field, select a
							connection pool you want this resource to use from the drop-down
							listbox.
						</p></li>
					<li class="listitem"><p>
							Optionally, you can enter a description into the <span
								class="guilabel">Description</span> field.
						</p></li>
					<li class="listitem"><p>Additional properties can be added
							if required.</p></li>
					<li class="listitem"><p>
							Click <span class="guibutton">OK</span> to create the new JDBC
							resource. The <span class="guilabel">JDBC Resources</span> frame
							will list all available JDBC Resources.
						</p></li>
				</ul>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-glassfish-config-jsp"></a>14.1. A
								Simple JSP Application with Glassfish, Connector/J and MySQL
							</h2>
						</div>
					</div>
				</div>
				<p>This section shows how to deploy a simple JSP application on
					Glassfish, that connects to a MySQL database.</p>
				<p>
					This example assumes you have already set up a suitable Connection
					Pool and JDBC Resource, as explained in the preceding sections. It
					is also assumed you have a sample database installed, such as
					<code class="literal">world</code>
					.
				</p>
				<p>
					The main application code,
					<code class="filename">index.jsp</code>
					is presented here:
				</p>
				<pre class="programlisting">
&lt;%@ page import="java.sql.*, javax.sql.*, java.io.*, javax.naming.*" %&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;Hello world from JSP&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;%
  InitialContext ctx;
  DataSource ds;
  Connection conn;
  Statement stmt;
  ResultSet rs;
  try {
    ctx = new InitialContext();
    ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MySQLDataSource");
    //ds = (DataSource) ctx.lookup("jdbc/MySQLDataSource");
    conn = ds.getConnection();
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT * FROM Country");
    while(rs.next()) {
%&gt;
    &lt;h3&gt;Name: &lt;%= rs.getString("Name") %&gt;&lt;/h3&gt;
    &lt;h3&gt;Population: &lt;%= rs.getString("Population") %&gt;&lt;/h3&gt;
&lt;%    
    }
  }
  catch (SQLException se) {
%&gt;
    &lt;%= se.getMessage() %&gt;
&lt;%      
  }
  catch (NamingException ne) {
%&gt;  
    &lt;%= ne.getMessage() %&gt;
&lt;%
  }
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
				<p>
					In addition two XML files are required:
					<code class="filename">web.xml</code>
					, and
					<code class="filename">sun-web.xml</code>
					. There may be other files present, such as classes and images.
					These files are organized into the directory structure as follows:
				</p>
				<pre class="programlisting">index.jsp
WEB-INF
   |
   - web.xml
   - sun-web.xml</pre>
				<p>
					The code for
					<code class="filename">web.xml</code>
					is:
				</p>
				<pre class="programlisting">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
  &lt;display-name&gt;HelloWebApp&lt;/display-name&gt;  
  &lt;distributable/&gt;
  &lt;resource-ref&gt;
    &lt;res-ref-name&gt;jdbc/MySQLDataSource&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
    &lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;                
  &lt;/resource-ref&gt;
&lt;/web-app&gt;
</pre>
				<p>
					The code for
					<code class="filename">sun-web.xml</code>
					is:
				</p>
				<pre class="programlisting">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd"&gt;
&lt;sun-web-app&gt;
  &lt;context-root&gt;HelloWebApp&lt;/context-root&gt;
  &lt;resource-ref&gt;
    &lt;res-ref-name&gt;jdbc/MySQLDataSource&lt;/res-ref-name&gt;
    &lt;jndi-name&gt;jdbc/MySQLDataSource&lt;/jndi-name&gt;  
  &lt;/resource-ref&gt; 
&lt;/sun-web-app&gt;
</pre>
				<p>
					These XML files illustrate a very important aspect of running JDBC
					applications on Glassfish. On Glassfish it is important to map the
					string specified for a JDBC resource to its JNDI name, as set up in
					the Glassfish administration console. In this example, the JNDI
					name for the JDBC resource, as specified in the Glassfish
					Administration console when creating the JDBC Resource, was
					<code class="literal">jdbc/MySQLDataSource</code>
					. This must be mapped to the name given in the application. In this
					example the name specified in the application,
					<code class="literal">jdbc/MySQLDataSource</code>
					, and the JNDI name, happen to be the same, but this does not
					necessarily have to be the case. Note that the XML element
					&lt;res-ref-name&gt; is used to specify the name as used in the
					application source code, and this is mapped to the JNDI name
					specified using the &lt;jndi-name&gt; element, in the file
					<code class="filename">sun-web.xml</code>
					. The resource also has to be created in the
					<code class="filename">web.xml</code>
					file, although the mapping of the resource to a JNDI name takes
					place in the
					<code class="filename">sun-web.xml</code>
					file.
				</p>
				<p>If you do not have this mapping set up correctly in the XML
					files you will not be able to lookup the data source using a JNDI
					lookup string such as:</p>
				<pre class="programlisting">ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MySQLDataSource");</pre>
				<p>You will still be able to access the data source directly
					using:</p>
				<pre class="programlisting">ds = (DataSource) ctx.lookup("jdbc/MySQLDataSource");</pre>
				<p>With the source files in place, in the correct directory
					structure, you are ready to deploy the application:</p>
				<div class="orderedlist">
					<ol class="orderedlist" type="1">
						<li class="listitem"><p>
								In the navigation tree, navigate to <span class="guilabel">Applications</span>
								- the <span class="guilabel">Applications</span> frame will be
								displayed. Click <span class="guibutton">Deploy</span>.
							</p></li>
						<li class="listitem"><p>You can now deploy an application
								packaged into a single WAR file from a remote client, or you can
								choose a packaged file or directory that is locally accessible
								to the server. If you are simply testing an application locally
								you can simply point Glassfish at the directory that contains
								your application, without needing to package the application
								into a WAR file.</p></li>
						<li class="listitem"><p>
								Now select the application type from the <span class="guilabel">Type</span>
								drop-down listbox, which in this example is
								<code class="literal">Web application</code>
								.
							</p></li>
						<li class="listitem"><p>Click OK.</p></li>
					</ol>
				</div>
				<p>
					Now, when you navigate to the <span class="guilabel">Applications</span>
					frame, you will have the option to <span class="guilabel">Launch</span>,
					<span class="guilabel">Redeploy</span>, or <span class="guilabel">Restart</span>
					your application. You can test your application by clicking <span
						class="guilabel">Launch</span>. The application will connection to
					the MySQL database and display the Name and Population of countries
					in the
					<code class="literal">Country</code>
					table.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-usagenotes-glassfish-config-servlet"></a>14.2. A
								Simple Servlet with Glassfish, Connector/J and MySQL
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id570528"></a>
				<p>
					This section describes a simple servlet that can be used in the
					Glassfish environment to access a MySQL database. As with the
					previous section, this example assumes the sample database
					<code class="literal">world</code>
					is installed.
				</p>
				<p>The project is set up with the following directory structure:
				</p>
				<pre class="programlisting">index.html
WEB-INF
   |
   - web.xml
   - sun-web.xml
   - classes
        |
        - HelloWebServlet.java
        - HelloWebServlet.class</pre>
				<p>
					The code for the servlet, located in
					<code class="filename">HelloWebServlet.java</code>
					, is as follows:
				</p>
				<pre class="programlisting">
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class HelloWebServlet extends HttpServlet {
  InitialContext ctx = null;
  DataSource ds = null;
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  String sql = "SELECT Name, Population FROM Country WHERE Name=?";
  public void init () throws ServletException {
    try {
      ctx = new InitialContext();
      ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MySQLDataSource");
      conn = ds.getConnection();
      ps = conn.prepareStatement(sql);
    }
    catch (SQLException se) {
      System.out.println("SQLException: "+se.getMessage());
    }
    catch (NamingException ne) {
      System.out.println("NamingException: "+ne.getMessage());  
    }  
  }
  public void destroy () {
    try {
      if (rs != null)
        rs.close();
      if (ps != null)
        ps.close();
      if (conn != null)
        conn.close();
      if (ctx != null)
        ctx.close(); 
    }     
    catch (SQLException se) {
      System.out.println("SQLException: "+se.getMessage());
    }
    catch (NamingException ne) {
      System.out.println("NamingException: "+ne.getMessage());  
    }  
  }
  public void doPost(HttpServletRequest req, HttpServletResponse resp){
    try {
      String country_name = req.getParameter("country_name");    
      resp.setContentType("text/html");
      PrintWriter writer = resp.getWriter();
      writer.println("&lt;html&gt;&lt;body&gt;");
      writer.println("&lt;p&gt;Country: "+country_name+"&lt;/p&gt;");
      ps.setString(1, country_name);
      rs = ps.executeQuery();
      if (!rs.next()){
        writer.println("&lt;p&gt;Country does not exist!&lt;/p&gt;");
      }
      else {
        rs.beforeFirst();
        while(rs.next()) {
          writer.println("&lt;p&gt;Name: "+rs.getString("Name")+"&lt;/p&gt;");
          writer.println("&lt;p&gt;Population: "+rs.getString("Population")+"&lt;/p&gt;");
        }
      }
      writer.println("&lt;/body&gt;&lt;/html&gt;");
      writer.close(); 
    }
    catch (Exception e) {
      e.printStackTrace();
    }  
  }
  public void doGet(HttpServletRequest req, HttpServletResponse resp){
    try {    
      resp.setContentType("text/html");
      PrintWriter writer = resp.getWriter();
      writer.println("&lt;html&gt;&lt;body&gt;");
      writer.println("&lt;p&gt;Hello from servlet doGet()&lt;/p&gt;");
      writer.println("&lt;/body&gt;&lt;/html&gt;");
      writer.close(); 
    }
    catch (Exception e) {
      e.printStackTrace();
    }  
  }
}
</pre>
				<p>
					In the preceding code a basic
					<code class="literal">doGet()</code>
					method is implemented, but is not used in the example. The code to
					establish the connection with the database is as shown in the
					previous example, <a class="xref"
						href="#connector-j-usagenotes-glassfish-config-jsp"
						title="14.1. A Simple JSP Application with Glassfish, Connector/J and MySQL">Section 14.1,
						“A Simple JSP Application with Glassfish, Connector/J and MySQL”</a>,
					and is most conveniently located in the servlet
					<code class="literal">init()</code>
					method. The corresponding freeing of resources is located in the
					destroy method. The main functionality of the servlet is located in
					the
					<code class="literal">doPost()</code>
					method. If the user enters nto the input form a country name that
					can be located in the database, the population of the country is
					returned. The code is invoked using a POST action associated with
					the input form. The form is defined in the file
					<code class="filename">index.html</code>
					:
				</p>
				<pre class="programlisting">
&lt;html&gt;
  &lt;head&gt;&lt;title&gt;HelloWebServlet&lt;/title&gt;&lt;/head&gt;
  
  &lt;body&gt;
    &lt;h1&gt;HelloWebServlet&lt;/h1&gt;
    
    &lt;p&gt;Please enter country name:&lt;/p&gt;
    
    &lt;form action="HelloWebServlet" method="POST"&gt;
      &lt;input type="text" name="country_name" length="50" /&gt;
      &lt;input type="submit" value="Submit" /&gt;
    &lt;/form&gt;
    
  &lt;/body&gt;
&lt;/html&gt;
</pre>
				<p>
					The XML files
					<code class="filename">web.xml</code>
					and
					<code class="filename">sun-web.xml</code>
					are as for the example in the preceding section, <a class="xref"
						href="#connector-j-usagenotes-glassfish-config-jsp"
						title="14.1. A Simple JSP Application with Glassfish, Connector/J and MySQL">Section 14.1,
						“A Simple JSP Application with Glassfish, Connector/J and MySQL”</a>,
					no additional changes are required.
				</p>
				<p>
					Whe compiling the Java source code, you will need to specify the
					path to the file
					<code class="filename">javaee.jar</code>
					. On Windows, this can be done as follows:
				</p>
				<pre class="programlisting">shell&gt; javac -classpath c:\glassfishv3\glassfish\lib\javaee.jar HelloWebServlet.java </pre>
				<p>
					Once the code is correctly located within its directory structure,
					and compiled, the application can be deployed in Glassfish. This is
					done in exactly the same way as described in the preceding section,
					<a class="xref" href="#connector-j-usagenotes-glassfish-config-jsp"
						title="14.1. A Simple JSP Application with Glassfish, Connector/J and MySQL">Section 14.1,
						“A Simple JSP Application with Glassfish, Connector/J and MySQL”</a>.
				</p>
				<p>
					Once deployed the application can be launched from within the
					Glassfish Administration Console. Enter a country name such as <span
						class="quote">“<span class="quote">England</span>”
					</span>, and the application will return <span class="quote">“<span
						class="quote">Country does not exist!</span>”
					</span>. Enter <span class="quote">“<span class="quote">France</span>”
					</span>, and the application will return a population of 59225700.
				</p>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-usagenotes-troubleshooting"></a>Chapter 15. Troubleshooting
							Connector/J Applications
						</h1>
					</div>
				</div>
			</div>
			<a class="indexterm" name="id570745"></a><a class="indexterm"
				name="id570758"></a><a class="indexterm" name="id570770"></a>
			<p>This section explains the symptoms and resolutions for the
				most commonly encountered issues with applications using MySQL
				Connector/J.</p>
			<p>
				<span class="bold"><strong>Questions</strong></span>
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-1">15.1: </a> When I try to
							connect to the database with MySQL Connector/J, I get the
							following exception:
						</p>
						<pre class="programlisting">SQLException: Server configuration denies access to data source
SQLState: 08001
VendorError: 0</pre>
						<p>What is going on? I can connect just fine with the MySQL
							command-line client.</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-2">15.2: </a> My
							application throws an SQLException 'No Suitable Driver'. Why is
							this happening?
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-3">15.3: </a> I'm trying to
							use MySQL Connector/J in an applet or application and I get an
							exception similar to:
						</p>
						<pre class="programlisting">SQLException: Cannot connect to MySQL server on host:3306.
Is there a MySQL server running on the machine/port you
are trying to connect to?
(java.security.AccessControlException)
SQLState: 08S01
VendorError: 0 </pre></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-4">15.4: </a> I have a
							servlet/application that works fine for a day, and then stops
							working overnight
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-5">15.5: </a> I'm trying to
							use JDBC 2.0 updatable result sets, and I get an exception saying
							my result set is not updatable.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-6">15.6: </a> I cannot
							connect to the MySQL server using Connector/J, and I'm sure the
							connection parameters are correct.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-7">15.7: </a> I am trying
							to connect to my MySQL server within my application, but I get
							the following error and stack trace:
						</p>
						<pre class="programlisting">java.net.SocketException
MESSAGE: Software caused connection abort: recv failed
STACKTRACE:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1392)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:1414)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:625)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1926)
at com.mysql.jdbc.Connection.&lt;init&gt;(Connection.java:452)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)</pre></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-8">15.8: </a> My
							application is deployed through JBoss and I am using transactions
							to handle the statements on the MySQL database. Under heavy loads
							I am getting a error and stack trace, but these only occur after
							a fixed period of heavy activity.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-9">15.9: </a> When using <span
								class="command"><strong>gcj</strong></span> an
							<code class="literal">java.io.CharConversionException</code>
							is raised when working with certain character sequences.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-10">15.10: </a> Updating a
							table that contains a primary key that is either <a class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
								target="_top"><code class="literal">FLOAT</code></a> or compound
							primary key that uses <a class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
								target="_top"><code class="literal">FLOAT</code></a> fails to
							update the table and raises an exception.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-11">15.11: </a> You get an
							<a class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_net_packet_too_large"
								target="_top"><code class="literal">ER_NET_PACKET_TOO_LARGE</code></a>
							exception, even though the binary blob size you want to insert
							using JDBC is safely below the <a class="ulink"
								href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
								target="_top"><code class="literal">max_allowed_packet</code></a>
							size.
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-12">15.12: </a> What should
							you do if you receive error messages similar to the following: <span
								class="quote">“<span class="quote">Communications
									link failure – Last packet sent to the server was X ms ago</span>”
							</span>?
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-13">15.13: </a> Why does
							Connector/J not reconnect to MySQL and re-issue the statement
							after a communication failure, instead of throwing an Exception,
							even though I use the
							<code class="literal">autoReconnect</code>
							connection string option?
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-14">15.14: </a> How can I
							use 3-byte UTF8 with Connector/J?
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-15">15.15: </a> How can I
							use 4-byte UTF8,
							<code class="literal">utf8mb4</code>
							with Connector/J?
						</p></li>
					<li class="listitem"><p>
							<a class="link" href="#qandaitem-15-1-16">15.16: </a> Using
							<code class="literal">useServerPrepStmts=false</code>
							and certain character encodings can lead to corruption when
							inserting BLOBs. How can this be avoided?
						</p></li>
				</ul>
			</div>
			<p>
				<span class="bold"><strong>Questions and Answers</strong></span>
			</p>
			<p>
				<a name="qandaitem-15-1-1"></a><span class="bold"><strong>15.1:
				</strong></span><span class="bold"><strong> When I try to connect to
						the database with MySQL Connector/J, I get the following
						exception: </strong></span>
			</p>
			<pre class="programlisting">SQLException: Server configuration denies access to data source
SQLState: 08001
VendorError: 0</pre>
			<p>
				<span class="bold"><strong> What is going on? I can
						connect just fine with the MySQL command-line client. </strong></span>
			</p>
			<p>MySQL Connector/J must use TCP/IP sockets to connect to MySQL,
				as Java does not support Unix Domain Sockets. Therefore, when MySQL
				Connector/J connects to MySQL, the security manager in MySQL server
				will use its grant tables to determine whether the connection is
				permitted.</p>
			<p>
				You must add the necessary security credentials to the MySQL server
				for this to happen, using the <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/grant.html"
					target="_top"><code class="literal">GRANT</code></a> statement to
				your MySQL Server. See <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/grant.html"
					target="_top"><code class="literal">GRANT</code> Syntax</a>, for
				more information.
			</p>
			<div xmlns="http://www.w3.org/1999/xhtml" class="note"
				style="margin-left: 0.5in; margin-right: 0.5in;">
				<div class="admon-title">Note</div>
				<p xmlns="">
					Testing your connectivity with the <span class="command"><strong>mysql</strong></span>
					command-line client will not work unless you add the "host" flag,
					and use something other than
					<code class="literal">localhost</code>
					for the host. The <span class="command"><strong>mysql</strong></span>
					command-line client will use Unix domain sockets if you use the
					special host name
					<code class="literal">localhost</code>
					. If you are testing connectivity to
					<code class="literal">localhost</code>
					, use
					<code class="literal">127.0.0.1</code>
					as the host name instead.
				</p>
			</div>
			<div xmlns="http://www.w3.org/1999/xhtml" class="warning"
				style="margin-left: 0.5in; margin-right: 0.5in;">
				<div class="admon-title">Warning</div>
				<p xmlns="">Changing privileges and permissions improperly in
					MySQL can potentially cause your server installation to not have
					optimal security properties.</p>
			</div>
			<p>
				<a name="qandaitem-15-1-2"></a><span class="bold"><strong>15.2:
				</strong></span><span class="bold"><strong> My application throws an
						SQLException 'No Suitable Driver'. Why is this happening? </strong></span>
			</p>
			<p>There are three possible causes for this error:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							The Connector/J driver is not in your
							<code class="literal">CLASSPATH</code>
							, see <a class="xref" href="#connector-j-installing"
								title="Chapter 3. Connector/J Installation">Chapter 3, <i>Connector/J
									Installation</i></a>.
						</p></li>
					<li class="listitem"><p>The format of your connection URL
							is incorrect, or you are referencing the wrong JDBC driver.</p></li>
					<li class="listitem"><p>
							When using DriverManager, the
							<code class="literal">jdbc.drivers</code>
							system property has not been populated with the location of the
							Connector/J driver.
						</p></li>
				</ul>
			</div>
			<p>
				<a name="qandaitem-15-1-3"></a><span class="bold"><strong>15.3:
				</strong></span><span class="bold"><strong> I'm trying to use MySQL
						Connector/J in an applet or application and I get an exception
						similar to: </strong></span>
			</p>
			<pre class="programlisting">SQLException: Cannot connect to MySQL server on host:3306.
Is there a MySQL server running on the machine/port you
are trying to connect to?
(java.security.AccessControlException)
SQLState: 08S01
VendorError: 0 </pre>
			<p>Either you're running an Applet, your MySQL server has been
				installed with the "skip-networking" option set, or your MySQL
				server has a firewall sitting in front of it.</p>
			<p>Applets can only make network connections back to the machine
				that runs the web server that served the .class files for the
				applet. This means that MySQL must run on the same machine (or you
				must have some sort of port re-direction) for this to work. This
				also means that you will not be able to test applets from your local
				file system, you must always deploy them to a web server.</p>
			<p>MySQL Connector/J can only communicate with MySQL using
				TCP/IP, as Java does not support Unix domain sockets. TCP/IP
				communication with MySQL might be affected if MySQL was started with
				the "skip-networking" flag, or if it is firewalled.</p>
			<p>
				If MySQL has been started with the "skip-networking" option set (the
				Debian Linux package of MySQL server does this for example), you
				need to comment it out in the file /etc/mysql/my.cnf or /etc/my.cnf.
				Of course your my.cnf file might also exist in the
				<code class="filename">data</code>
				directory of your MySQL server, or anywhere else (depending on how
				MySQL was compiled for your system). Binaries created by us always
				look in /etc/my.cnf and [datadir]/my.cnf. If your MySQL server has
				been firewalled, you will need to have the firewall configured to
				allow TCP/IP connections from the host where your Java code is
				running to the MySQL server on the port that MySQL is listening to
				(by default, 3306).
			</p>
			<p>
				<a name="qandaitem-15-1-4"></a><span class="bold"><strong>15.4:
				</strong></span><span class="bold"><strong> I have a
						servlet/application that works fine for a day, and then stops
						working overnight </strong></span>
			</p>
			<p>
				MySQL closes connections after 8 hours of inactivity. You either
				need to use a connection pool that handles stale connections or use
				the "autoReconnect" parameter (see <a class="xref"
					href="#connector-j-reference-configuration-properties"
					title="5.1. Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J">Section 5.1,
					“Driver/Datasource Class Names, URL Syntax and Configuration
					Properties for Connector/J”</a>).
			</p>
			<p>
				Also, catch SQLExceptions in your application and deal with them,
				rather than propagating them all the way until your application
				exits. This is just good programming practice. MySQL Connector/J
				will set the SQLState (see
				<code class="literal">java.sql.SQLException.getSQLState()</code>
				in your API docs) to "08S01" when it encounters network-connectivity
				issues during the processing of a query. Attempt to reconnect to
				MySQL at this point.
			</p>
			<p>The following (simplistic) example shows what code that can
				handle these exceptions might look like:</p>
			<p></p>
			<div class="example">
				<a name="connector-j-examples-transaction-retry"></a>
				<p class="title">
					<b>Example 15.1. Connector/J: Example of transaction with retry
						logic</b>
				</p>
				<div class="example-contents">
					<pre class="programlisting">public void doBusinessOp() throws SQLException {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    //
    // How many times do you want to retry the transaction
    // (or at least _getting_ a connection)?
    //
    int retryCount = 5;
    boolean transactionCompleted = false;
    do {
        try {
            conn = getConnection(); // assume getting this from a
                                    // javax.sql.DataSource, or the
                                    // java.sql.DriverManager
            conn.setAutoCommit(false);
            //
            // Okay, at this point, the 'retry-ability' of the
            // transaction really depends on your application logic,
            // whether or not you're using autocommit (in this case
            // not), and whether you're using transactional storage
            // engines
            //
            // For this example, we'll assume that it's _not_ safe
            // to retry the entire transaction, so we set retry
            // count to 0 at this point
            //
            // If you were using exclusively transaction-safe tables,
            // or your application could recover from a connection going
            // bad in the middle of an operation, then you would not
            // touch 'retryCount' here, and just let the loop repeat
            // until retryCount == 0.
            //
            retryCount = 0;
            stmt = conn.createStatement();
            String query = "SELECT foo FROM bar ORDER BY baz";
            rs = stmt.executeQuery(query);
            while (rs.next()) {
            }
            rs.close();
            rs = null;
            stmt.close();
            stmt = null;
            conn.commit();
            conn.close();
            conn = null;
            transactionCompleted = true;
        } catch (SQLException sqlEx) {
            //
            // The two SQL states that are 'retry-able' are 08S01
            // for a communications error, and 40001 for deadlock.
            //
            // Only retry if the error was due to a stale connection,
            // communications problem or deadlock
            //
            String sqlState = sqlEx.getSQLState();
            if ("08S01".equals(sqlState) || "40001".equals(sqlState)) {
                retryCount -= 1;
            } else {
                retryCount = 0;
            }
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                    // You'd probably want to log this...
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException sqlEx) {
                    // You'd probably want to log this as well...
                }
            }
            if (conn != null) {
                try {
                    //
                    // If we got here, and conn is not null, the
                    // transaction should be rolled back, as not
                    // all work has been done
                    try {
                        conn.rollback();
                    } finally {
                        conn.close();
                    }
                } catch (SQLException sqlEx) {
                    //
                    // If we got an exception here, something
                    // pretty serious is going on, so we better
                    // pass it up the stack, rather than just
                    // logging it...
                    throw sqlEx;
                }
            }
        }
    } while (!transactionCompleted &amp;&amp; (retryCount &gt; 0));
}</pre>
				</div>
			</div>
			<p>
				<br class="example-break">
			</p>
			<div xmlns="http://www.w3.org/1999/xhtml" class="note"
				style="margin-left: 0.5in; margin-right: 0.5in;">
				<div class="admon-title">Note</div>
				<p xmlns="">
					Use of the
					<code class="option">autoReconnect</code>
					option is not recommended because there is no safe method of
					reconnecting to the MySQL server without risking some corruption of
					the connection state or database state information. Instead, use a
					connection pool, which will enable your application to connect to
					the MySQL server using an available connection from the pool. The
					<code class="option">autoReconnect</code>
					facility is deprecated, and may be removed in a future release.
				</p>
			</div>
			<p>
				<a name="qandaitem-15-1-5"></a><span class="bold"><strong>15.5:
				</strong></span><span class="bold"><strong> I'm trying to use JDBC
						2.0 updatable result sets, and I get an exception saying my result
						set is not updatable. </strong></span>
			</p>
			<p>Because MySQL does not have row identifiers, MySQL Connector/J
				can only update result sets that have come from queries on tables
				that have at least one primary key, the query must select every
				primary key and the query can only span one table (that is, no
				joins). This is outlined in the JDBC specification.</p>
			<p>
				Note that this issue only occurs when using updatable result sets,
				and is caused because Connector/J is unable to guarantee that it can
				identify the correct rows within the result set to be updated
				without having a unique reference to each row. There is no
				requirement to have a unique field on a table if you are using <a
					class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
					target="_top"><code class="literal">UPDATE</code></a> or <a
					class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/delete.html"
					target="_top"><code class="literal">DELETE</code></a> statements on
				a table where you can individually specify the criteria to be
				matched using a
				<code class="literal">WHERE</code>
				clause.
			</p>
			<p>
				<a name="qandaitem-15-1-6"></a><span class="bold"><strong>15.6:
				</strong></span><span class="bold"><strong> I cannot connect to the
						MySQL server using Connector/J, and I'm sure the connection
						parameters are correct. </strong></span>
			</p>
			<p>
				Make sure that the <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_skip-networking"
					target="_top"><code class="option">skip-networking</code></a>
				option has not been enabled on your server. Connector/J must be able
				to communicate with your server over TCP/IP, named sockets are not
				supported. Also ensure that you are not filtering connections
				through a Firewall or other network security system. For more
				information, see <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/can-not-connect-to-server.html"
					target="_top"><code class="literal">Can't connect to
						[local] MySQL server</code></a>.
			</p>
			<p>
				<a name="qandaitem-15-1-7"></a><span class="bold"><strong>15.7:
				</strong></span><span class="bold"><strong> I am trying to connect
						to my MySQL server within my application, but I get the following
						error and stack trace: </strong></span>
			</p>
			<pre class="programlisting">java.net.SocketException
MESSAGE: Software caused connection abort: recv failed
STACKTRACE:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1392)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:1414)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:625)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1926)
at com.mysql.jdbc.Connection.&lt;init&gt;(Connection.java:452)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)</pre>
			<p>The error probably indicates that you are using a older
				version of the Connector/J JDBC driver (2.0.14 or 3.0.x) and you are
				trying to connect to a MySQL server with version 4.1x or newer. The
				older drivers are not compatible with 4.1 or newer of MySQL as they
				do not support the newer authentication mechanisms.</p>
			<p>
				It is likely that the older version of the Connector/J driver exists
				within your application directory or your
				<code class="literal">CLASSPATH</code>
				includes the older Connector/J package.
			</p>
			<p>
				<a name="qandaitem-15-1-8"></a><span class="bold"><strong>15.8:
				</strong></span><span class="bold"><strong> My application is
						deployed through JBoss and I am using transactions to handle the
						statements on the MySQL database. Under heavy loads I am getting a
						error and stack trace, but these only occur after a fixed period
						of heavy activity. </strong></span>
			</p>
			<p>This is a JBoss, not Connector/J, issue and is connected to
				the use of transactions. Under heavy loads the time taken for
				transactions to complete can increase, and the error is caused
				because you have exceeded the predefined timeout.</p>
			<p>
				You can increase the timeout value by setting the
				<code class="literal">TransactionTimeout</code>
				attribute to the
				<code class="literal">TransactionManagerService</code>
				within the
				<code class="filename">/conf/jboss-service.xml</code>
				file (pre-4.0.3) or
				<code class="filename">/deploy/jta-service.xml</code>
				for JBoss 4.0.3 or later. See <a class="ulink"
					href="http://wiki.jboss.org/wiki/Wiki.jsp?page=TransactionTimeout"
					target="_top">TransactionTimeoute</a> within the JBoss wiki for
				more information.
			</p>
			<p>
				<a name="qandaitem-15-1-9"></a><span class="bold"><strong>15.9:
				</strong></span><span class="bold"><strong> When using <span
						class="command"><strong>gcj</strong></span> an <code
							class="literal">java.io.CharConversionException</code> is raised
						when working with certain character sequences.
				</strong></span>
			</p>
			<p>
				This is a known issue with <span class="command"><strong>gcj</strong></span>
				which raises an exception when it reaches an unknown character or
				one it cannot convert. Add
				<code class="literal">useJvmCharsetConverters=true</code>
				to your connection string to force character conversion outside of
				the <span class="command"><strong>gcj</strong></span> libraries, or
				try a different JDK.
			</p>
			<p>
				<a name="qandaitem-15-1-10"></a><span class="bold"><strong>15.10:
				</strong></span><span class="bold"><strong> Updating a table that
						contains a primary key that is either <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
						target="_top"><code class="literal">FLOAT</code></a> or compound
						primary key that uses <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
						target="_top"><code class="literal">FLOAT</code></a> fails to
						update the table and raises an exception.
				</strong></span>
			</p>
			<p>
				Connector/J adds conditions to the
				<code class="literal">WHERE</code>
				clause during an <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
					target="_top"><code class="literal">UPDATE</code></a> to check the
				old values of the primary key. If there is no match then Connector/J
				considers this a failure condition and raises an exception.
			</p>
			<p>The problem is that rounding differences between supplied
				values and the values stored in the database may mean that the
				values never match, and hence the update fails. The issue will
				affect all queries, not just those from Connector/J.</p>
			<p>
				To prevent this issue, use a primary key that does not use <a
					class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
					target="_top"><code class="literal">FLOAT</code></a>. If you have
				to use a floating point column in your primary key use <a
					class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
					target="_top"><code class="literal">DOUBLE</code></a> or <a
					class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
					target="_top"><code class="literal">DECIMAL</code></a> types in
				place of <a class="ulink"
					href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
					target="_top"><code class="literal">FLOAT</code></a>.
			</p>
			<p>
				<a name="qandaitem-15-1-11"></a><span class="bold"><strong>15.11:
				</strong></span><span class="bold"><strong> You get an <a
						class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_net_packet_too_large"
						target="_top"><code class="literal">ER_NET_PACKET_TOO_LARGE</code></a>
						exception, even though the binary blob size you want to insert
						using JDBC is safely below the <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
						target="_top"><code class="literal">max_allowed_packet</code></a>
						size.
				</strong></span>
			</p>
			<p>
				This is because the
				<code class="literal">hexEscapeBlock()</code>
				method in
				<code class="literal">com.mysql.jdbc.PreparedStatement.streamToBytes()</code>
				may almost double the size of your data.
			</p>
			<p>
				<a name="qandaitem-15-1-12"></a><span class="bold"><strong>15.12:
				</strong></span><span class="bold"><strong> What should you do if
						you receive error messages similar to the following: <span
						class="quote">“<span class="quote">Communications
								link failure – Last packet sent to the server was X ms ago</span>”
					</span>?
				</strong></span>
			</p>
			<p>Generally speaking, this error suggests that the network
				connection has been closed. There can be several root causes:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>Firewalls or routers may clamp
							down on idle connections (the MySQL client/server protocol does
							not ping).</p></li>
					<li class="listitem"><p>
							The MySQL Server may be closing idle connections which exceed the
							<code class="literal">wait_timeout</code>
							or
							<code class="literal">interactive_timeout</code>
							threshold.
						</p></li>
				</ul>
			</div>
			<p>To help troubleshoot these issues, the following tips can be
				used. If a recent (5.1.13+) version of Connector/J is used, you will
				see an improved level of information compared to earlier versions.
				Older versions simply display the last time a packet was sent to the
				server, which is frequently 0 ms ago. This is of limited use, as it
				may be that a packet was just sent, while a packet from the server
				has not been received for several hours. Knowing the period of time
				since Connector/J last received a packet from the server is useful
				information, so if this is not displayed in your exception message,
				it is recommended that you update Connector/J.</p>
			<p>
				Further, if the time a packet was last sent/received exceeds the
				<code class="literal">wait_timeout</code>
				or
				<code class="literal">interactive_timeout</code>
				threshold, this is noted in the exception message.
			</p>
			<p>Although network connections can be volatile, the following
				can be helpful in avoiding problems:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							Ensure connections are valid when used from the connection pool.
							Use a query that starts with
							<code class="literal">/* ping */</code>
							to execute a lightweight ping instead of full query. Note, the
							syntax of the ping needs to be exactly as specified here.
						</p></li>
					<li class="listitem"><p>Minimize the duration a connection
							object is left idle while other application logic is executed.</p></li>
					<li class="listitem"><p>Explicitly validate the connection
							before using it if the connection has been left idle for an
							extended period of time.</p></li>
					<li class="listitem"><p>
							Ensure that
							<code class="literal">wait_timeout</code>
							and
							<code class="literal">interactive_timeout</code>
							are set sufficiently high.
						</p></li>
					<li class="listitem"><p>
							Ensure that
							<code class="literal">tcpKeepalive</code>
							is enabled.
						</p></li>
					<li class="listitem"><p>Ensure that any configurable
							firewall or router timeout settings allow for the maximum
							expected connection idle time.</p></li>
				</ul>
			</div>
			<div xmlns="http://www.w3.org/1999/xhtml" class="note"
				style="margin-left: 0.5in; margin-right: 0.5in;">
				<div class="admon-title">Note</div>
				<p xmlns="">Do not expect to be able to reuse a connection
					without problems, if it has being lying idle for a period. If a
					connection is to be reused after being idle for any length of time,
					ensure that you explicitly test it before reusing it.</p>
			</div>
			<p>
				<a name="qandaitem-15-1-13"></a><span class="bold"><strong>15.13:
				</strong></span><span class="bold"><strong> Why does Connector/J not
						reconnect to MySQL and re-issue the statement after a
						communication failure, instead of throwing an Exception, even
						though I use the <code class="literal">autoReconnect</code>
						connection string option?
				</strong></span>
			</p>
			<p>
				There are several reasons for this. The first is transactional
				integrity. The MySQL Reference Manual states that <span
					class="quote">“<span class="quote">there is no safe
						method of reconnecting to the MySQL server without risking some
						corruption of the connection state or database state information</span>”
				</span>. Consider the following series of statements for example:
			</p>
			<pre class="programlisting">
conn.createStatement().execute(
  "UPDATE checking_account SET balance = balance - 1000.00 WHERE customer='Smith'");
conn.createStatement().execute(
  "UPDATE savings_account SET balance = balance + 1000.00 WHERE customer='Smith'");
conn.commit();
</pre>
			<p>
				Consider the case where the connection to the server fails after the
				<code class="literal">UPDATE</code>
				to
				<code class="literal">checking_account</code>
				. If no exception is thrown, and the application never learns about
				the problem, it will continue executing. However, the server did not
				commit the first transaction in this case, so that will get rolled
				back. But execution continues with the next transaction, and
				increases the
				<code class="literal">savings_account</code>
				balance by 1000. The application did not receive an exception, so it
				continued regardless, eventually committing the second transaction,
				as the commit only applies to the changes made in the new
				connection. Rather than a transfer taking place, a deposit was made
				in this example.
			</p>
			<p>
				Note that running with
				<code class="literal">auto-commit</code>
				enabled does not solve this problem. When Connector/J encounters a
				communication problem, there is no means to determine whether the
				server processed the currently executing statement or not. The
				following theoretical states are equally possible:
			</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>The server never received the
							statement, and therefore no related processing occurred on the
							server.</p></li>
					<li class="listitem"><p>The server received the statement,
							executed it in full, but the response was not received by the
							client.</p></li>
				</ul>
			</div>
			<p>
				If you are running with
				<code class="literal">auto-commit</code>
				enabled, it is not possible to guarantee the state of data on the
				server when a communication exception is encountered. The statement
				may have reached the server, or it may not. All you know is that
				communication failed at some point, before the client received
				confirmation (or data) from the server. This does not only affect
				<code class="literal">auto-commit</code>
				statements though. If the communication problem occurred during
				<code class="literal">Connection.commit()</code>
				, the question arises of whether the transaction was committed on
				the server before the communication failed, or whether the server
				received the commit request at all.
			</p>
			<p>The second reason for the generation of exceptions is that
				transaction-scoped contextual data may be vulnerable, for example:</p>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>Temporary tables.</p></li>
					<li class="listitem"><p>User-defined variables.</p></li>
					<li class="listitem"><p>Server-side prepared statements.</p></li>
				</ul>
			</div>
			<p>These items are lost when a connection fails, and if the
				connection silently reconnects without generating an exception, this
				could be detrimental to the correct execution of your application.</p>
			<p>In summary, communication errors generate conditions that may
				well be unsafe for Connector/J to simply ignore by silently
				reconnecting. It is necessary for the application to be notified. It
				is then for the application developer to decide how to proceed in
				the event of connection errors and failures.</p>
			<p>
				<a name="qandaitem-15-1-14"></a><span class="bold"><strong>15.14:
				</strong></span><span class="bold"><strong> How can I use 3-byte
						UTF8 with Connector/J? </strong></span>
			</p>
			<p>
				To use 3-byte UTF8 with Connector/J set
				<code class="literal">characterEncoding=utf8</code>
				and set
				<code class="literal">useUnicode=true</code>
				in the connection string.
			</p>
			<p>
				<a name="qandaitem-15-1-15"></a><span class="bold"><strong>15.15:
				</strong></span><span class="bold"><strong> How can I use 4-byte
						UTF8, <code class="literal">utf8mb4</code> with Connector/J?
				</strong></span>
			</p>
			<p>
				To use 4-byte UTF8 with Connector/J configure the MySQL server with
				<code class="literal">character_set_server=utf8mb4</code>
				. Connector/J will then use that setting as long as
				<code class="literal">characterEncoding</code>
				has not been set in the connection string. This is equivalent to
				autodetection of the character set.
			</p>
			<p>
				<a name="qandaitem-15-1-16"></a><span class="bold"><strong>15.16:
				</strong></span><span class="bold"><strong> Using <code
							class="literal">useServerPrepStmts=false</code> and certain
						character encodings can lead to corruption when inserting BLOBs.
						How can this be avoided?
				</strong></span>
			</p>
			<p>When using certain character encodings, such as SJIS, CP932,
				and BIG5, it is possible that BLOB data contains characters that can
				be interpreted as control characters, for example, backslash, '\'.
				This can lead to corrupted data when inserting BLOBs into the
				database. There are two things that need to be done to avoid this:</p>
			<div class="orderedlist">
				<ol class="orderedlist" type="1">
					<li class="listitem"><p>
							Set the connection string option
							<code class="literal">useServerPrepStmts</code>
							to
							<code class="literal">true</code>
							.
						</p></li>
					<li class="listitem"><p>
							Set
							<code class="literal">SQL_MODE</code>
							to
							<code class="literal">NO_BACKSLASH_ESCAPES</code>
							.
						</p></li>
				</ol>
			</div>
		</div>
		<div class="chapter">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-support"></a>Chapter 16. Connector/J Support
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a
							href="#connector-j-support-community">16.1. Connector/J
								Community Support</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-support-bug-report">16.2. How to Report
								Connector/J Bugs or Problems</a></span>
					</dt>
					<dt>
						<span class="section"><a
							href="#connector-j-support-changelog">16.3. Connector/J
								Change History</a></span>
					</dt>
				</dl>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-support-community"></a>16.1. Connector/J
								Community Support
							</h2>
						</div>
					</div>
				</div>
				<p>
					Oracle provides assistance to the user community by means of its
					mailing lists. For Connector/J related issues, you can get help
					from experienced users by using the MySQL and Java mailing list.
					Archives and subscription information is available online at <a
						class="ulink" href="http://lists.mysql.com/java" target="_top">http://lists.mysql.com/java</a>.
				</p>
				<p>
					For information about subscribing to MySQL mailing lists or to
					browse list archives, visit <a class="ulink"
						href="http://lists.mysql.com/" target="_top">http://lists.mysql.com/</a>.
					See <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/mailing-lists.html"
						target="_top">MySQL Mailing Lists</a>.
				</p>
				<p>
					Community support from experienced users is also available through
					the <a class="ulink" href="http://forums.mysql.com/list.php?39"
						target="_top">JDBC Forum</a>. You may also find help from other
					users in the other MySQL Forums, located at <a class="ulink"
						href="http://forums.mysql.com" target="_top">http://forums.mysql.com</a>.
					See <a class="ulink"
						href="http://dev.mysql.com/doc/refman/5.5/en/forums.html"
						target="_top">MySQL Community Support at the MySQL Forums</a>.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-support-bug-report"></a>16.2. How to Report
								Connector/J Bugs or Problems
							</h2>
						</div>
					</div>
				</div>
				<a class="indexterm" name="id572350"></a>
				<p>
					The normal place to report bugs is <a class="ulink"
						href="http://bugs.mysql.com/" target="_top">http://bugs.mysql.com/</a>,
					which is the address for our bugs database. This database is
					public, and can be browsed and searched by anyone. If you log in to
					the system, you will also be able to enter new reports.
				</p>
				<p>
					If you have found a sensitive security bug in MySQL, you can send
					email to
					<code class="email">
						&lt;<a class="email" href="mailto:security@mysql.com">security@mysql.com</a>&gt;
					</code>
					.
				</p>
				<p>Writing a good bug report takes patience, but doing it right
					the first time saves time both for us and for yourself. A good bug
					report, containing a full test case for the bug, makes it very
					likely that we will fix the bug in the next release.</p>
				<p>This section will help you write your report correctly so
					that you do not waste your time doing things that may not help us
					much or at all.</p>
				<p>
					If you have a repeatable bug report, please report it to the bugs
					database at <a class="ulink" href="http://bugs.mysql.com/"
						target="_top">http://bugs.mysql.com/</a>. Any bug that we are able
					to repeat has a high chance of being fixed in the next MySQL
					release.
				</p>
				<p>To report other problems, you can use one of the MySQL
					mailing lists.</p>
				<p>Remember that it is possible for us to respond to a message
					containing too much information, but not to one containing too
					little. People often omit facts because they think they know the
					cause of a problem and assume that some details do not matter.</p>
				<p>A good principle is this: If you are in doubt about stating
					something, state it. It is faster and less troublesome to write a
					couple more lines in your report than to wait longer for the answer
					if we must ask you to provide information that was missing from the
					initial report.</p>
				<p>The most common errors made in bug reports are (a) not
					including the version number of Connector/J or MySQL used, and (b)
					not fully describing the platform on which Connector/J is installed
					(including the JVM version, and the platform type and version
					number that MySQL itself is installed on).</p>
				<p>
					This is highly relevant information, and in 99 cases out of 100,
					the bug report is useless without it. Very often we get questions
					like, <span class="quote">“<span class="quote">Why
							doesn't this work for me?</span>”
					</span> Then we find that the feature requested wasn't implemented in that
					MySQL version, or that a bug described in a report has already been
					fixed in newer MySQL versions.
				</p>
				<p>Sometimes the error is platform-dependent; in such cases, it
					is next to impossible for us to fix anything without knowing the
					operating system and the version number of the platform.</p>
				<p>If at all possible, create a repeatable, standalone testcase
					that doesn't involve any third-party classes.</p>
				<p>
					To streamline this process, we ship a base class for testcases with
					Connector/J, named '
					<code class="classname">com.mysql.jdbc.util.BaseBugReport</code>
					'. To create a testcase for Connector/J using this class, create
					your own class that inherits from
					<code class="classname">com.mysql.jdbc.util.BaseBugReport</code>
					and override the methods
					<code class="function">setUp()</code>
					,
					<code class="function">tearDown()</code>
					and
					<code class="function">runTest()</code>
					.
				</p>
				<p>
					In the
					<code class="function">setUp()</code>
					method, create code that creates your tables, and populates them
					with any data needed to demonstrate the bug.
				</p>
				<p>
					In the
					<code class="function">runTest()</code>
					method, create code that demonstrates the bug using the tables and
					data you created in the
					<code class="literal">setUp</code>
					method.
				</p>
				<p>
					In the
					<code class="function">tearDown()</code>
					method, drop any tables you created in the
					<code class="function">setUp()</code>
					method.
				</p>
				<p>
					In any of the above three methods, use one of the variants of the
					<code class="function">getConnection()</code>
					method to create a JDBC connection to MySQL:
				</p>
				<div class="itemizedlist">
					<ul class="itemizedlist" style="list-style-type: disc;">
						<li class="listitem"><p>
								<code class="function">getConnection()</code>
								- Provides a connection to the JDBC URL specified in
								<code class="function">getUrl()</code>
								. If a connection already exists, that connection is returned,
								otherwise a new connection is created.
							</p></li>
						<li class="listitem"><p>
								<code class="function">getNewConnection()</code>
								- Use this if you need to get a new connection for your bug
								report (that is, there is more than one connection involved).
							</p></li>
						<li class="listitem"><p>
								<code class="function">getConnection(String url)</code>
								- Returns a connection using the given URL.
							</p></li>
						<li class="listitem"><p>
								<code class="function">getConnection(String url,
									Properties props)</code>
								- Returns a connection using the given URL and properties.
							</p></li>
					</ul>
				</div>
				<p>
					If you need to use a JDBC URL that is different from
					'jdbc:mysql:///test', override the method
					<code class="function">getUrl()</code>
					as well.
				</p>
				<p>
					Use the
					<code class="function">assertTrue(boolean expression)</code>
					and
					<code class="function">assertTrue(String failureMessage,
						boolean expression)</code>
					methods to create conditions that must be met in your testcase
					demonstrating the behavior you are expecting (vs. the behavior you
					are observing, which is why you are most likely filing a bug
					report).
				</p>
				<p>
					Finally, create a
					<code class="function">main()</code>
					method that creates a new instance of your testcase, and calls the
					<code class="literal">run</code>
					method:
				</p>
				<pre class="programlisting">public static void main(String[] args) throws Exception {
      new MyBugReport().run();
 }</pre>
				<p>
					Once you have finished your testcase, and have verified that it
					demonstrates the bug you are reporting, upload it with your bug
					report to <a class="ulink" href="http://bugs.mysql.com/"
						target="_top">http://bugs.mysql.com/</a>.
				</p>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="connector-j-support-changelog"></a>16.3. Connector/J
								Change History
							</h2>
						</div>
					</div>
				</div>
				<p>
					The Connector/J Change History (Changelog) is located with the main
					Changelog for MySQL. See <a class="xref" href="#cj-news"
						title="Appendix A. MySQL Connector/J Change History">Appendix A,
						<i>MySQL Connector/J Change History</i>
					</a>.
				</p>
			</div>
		</div>
		<div class="appendix">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="cj-news"></a>Appendix A. MySQL Connector/J Change
							History
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a href="#cj-news-5-1-x">A.1.
								Changes in MySQL Connector/J 5.1.x</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-5-1-22">A.1.1.
										Changes in MySQL Connector/J 5.1.22 (Not yet released)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-21">A.1.2.
										Changes in MySQL Connector/J 5.1.21 (2012-07-03)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-20">A.1.3.
										Changes in MySQL Connector/J 5.1.20 (2012-05-01)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-19">A.1.4.
										Changes in MySQL Connector/J 5.1.19 (April 2012)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-18">A.1.5.
										Changes in MySQL Connector/J 5.1.18 (2011-10-04)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-17">A.1.6.
										Changes in MySQL Connector/J 5.1.17 (2011-07-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-16">A.1.7.
										Changes in MySQL Connector/J 5.1.16 (Not released)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-15">A.1.8.
										Changes in MySQL Connector/J 5.1.15 (2011-02-09)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-14">A.1.9.
										Changes in MySQL Connector/J 5.1.14 (6th December 2010)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-13">A.1.10.
										Changes in MySQL Connector/J 5.1.13 (2010-06-24)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-12">A.1.11.
										Changes in MySQL Connector/J 5.1.12 (2010-02-18)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-11">A.1.12.
										Changes in MySQL Connector/J 5.1.11 (2010-01-21)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-10">A.1.13.
										Changes in MySQL Connector/J 5.1.10 (2009-09-23)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-9">A.1.14.
										Changes in MySQL Connector/J 5.1.9 (2009-09-21)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-8">A.1.15.
										Changes in MySQL Connector/J 5.1.8 (2009-07-16)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-7">A.1.16.
										Changes in MySQL Connector/J 5.1.7 (2008-10-21)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-6">A.1.17.
										Changes in MySQL Connector/J 5.1.6 (2008-03-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-5">A.1.18.
										Changes in MySQL Connector/J 5.1.5 (2007-10-09)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-4">A.1.19.
										Changes in MySQL Connector/J 5.1.4 (Not Released)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-3">A.1.20.
										Changes in MySQL Connector/J 5.1.3 (2007-09-10)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-2">A.1.21.
										Changes in MySQL Connector/J 5.1.2 (2007-06-29)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-1">A.1.22.
										Changes in MySQL Connector/J 5.1.1 (2007-06-22)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-1-0">A.1.23.
										Changes in MySQL Connector/J 5.1.0 (2007-04-11)</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a href="#cj-news-5-0-x">A.2.
								Changes in MySQL Connector/J 5.0.x</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-5-0-8">A.2.1.
										Changes in MySQL Connector/J 5.0.8 (2007-10-09)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-7">A.2.2.
										Changes in MySQL Connector/J 5.0.7 (2007-07-20)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-6">A.2.3.
										Changes in MySQL Connector/J 5.0.6 (2007-05-15)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-5">A.2.4.
										Changes in MySQL Connector/J 5.0.5 (2007-03-02)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-4">A.2.5.
										Changes in MySQL Connector/J 5.0.4 (2006-10-20)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-3">A.2.6.
										Changes in MySQL Connector/J 5.0.3 (2006-07-26, beta)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-2">A.2.7.
										Changes in MySQL Connector/J 5.0.2 (2006-07-11)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-1">A.2.8.
										Changes in MySQL Connector/J 5.0.1 (Not Released)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-5-0-0">A.2.9.
										Changes in MySQL Connector/J 5.0.0 (2005-12-22)</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a href="#cj-news-3-1-x">A.3.
								Changes in MySQL Connector/J 3.1.x</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-3-1-15">A.3.1.
										Changes in MySQL Connector/J 3.1.15 (Not yet released)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-14">A.3.2.
										Changes in MySQL Connector/J 3.1.14 (2006-10-19)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-13">A.3.3.
										Changes in MySQL Connector/J 3.1.13 (2006-05-26)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-12">A.3.4.
										Changes in MySQL Connector/J 3.1.12 (2005-11-30)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-11">A.3.5.
										Changes in MySQL Connector/J 3.1.11 (2005-10-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-10">A.3.6.
										Changes in MySQL Connector/J 3.1.10 (2005-06-23)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-9">A.3.7.
										Changes in MySQL Connector/J 3.1.9 (2005-06-22)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-8">A.3.8.
										Changes in MySQL Connector/J 3.1.8 (2005-04-14)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-7">A.3.9.
										Changes in MySQL Connector/J 3.1.7 (2005-02-18)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-6">A.3.10.
										Changes in MySQL Connector/J 3.1.6 (2004-12-23)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-5">A.3.11.
										Changes in MySQL Connector/J 3.1.5 (2004-12-02)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-4">A.3.12.
										Changes in MySQL Connector/J 3.1.4 (2004-09-04)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-3">A.3.13.
										Changes in MySQL Connector/J 3.1.3 (2004-07-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-2">A.3.14.
										Changes in MySQL Connector/J 3.1.2 (2004-06-09)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-1">A.3.15.
										Changes in MySQL Connector/J 3.1.1 (2004-02-14, alpha)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-1-0">A.3.16.
										Changes in MySQL Connector/J 3.1.0 (2003-02-18, alpha)</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a href="#cj-news-3-0-x">A.4.
								Changes in MySQL Connector/J 3.0.x</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-3-0-17">A.4.1.
										Changes in MySQL Connector/J 3.0.17 (2005-06-23)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-16">A.4.2.
										Changes in MySQL Connector/J 3.0.16 (2004-11-15)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-15">A.4.3.
										Changes in MySQL Connector/J 3.0.15 (2004-09-04)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-14">A.4.4.
										Changes in MySQL Connector/J 3.0.14 (2004-05-28)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-13">A.4.5.
										Changes in MySQL Connector/J 3.0.13 (2004-05-27)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-12">A.4.6.
										Changes in MySQL Connector/J 3.0.12 (2004-05-18)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-11">A.4.7.
										Changes in MySQL Connector/J 3.0.11 (2004-02-19)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-10">A.4.8.
										Changes in MySQL Connector/J 3.0.10 (2004-01-13)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-9">A.4.9.
										Changes in MySQL Connector/J 3.0.9 (2003-10-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-8">A.4.10.
										Changes in MySQL Connector/J 3.0.8 (2003-05-23)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-7">A.4.11.
										Changes in MySQL Connector/J 3.0.7 (2003-04-08)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-6">A.4.12.
										Changes in MySQL Connector/J 3.0.6 (2003-02-18)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-5">A.4.13.
										Changes in MySQL Connector/J 3.0.5 (2003-01-22)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-4">A.4.14.
										Changes in MySQL Connector/J 3.0.4 (2003-01-06)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-3">A.4.15.
										Changes in MySQL Connector/J 3.0.3 (2002-12-17)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-2">A.4.16.
										Changes in MySQL Connector/J 3.0.2 (2002-11-08)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-1">A.4.17.
										Changes in MySQL Connector/J 3.0.1 (2002-09-21)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-3-0-0">A.4.18.
										Changes in MySQL Connector/J 3.0.0 (2002-07-31)</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a href="#cj-news-2-0-x">A.5.
								Changes in MySQL Connector/J 2.0.x</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-2-0-14">A.5.1.
										Changes in MySQL Connector/J 2.0.14 (2002-05-16)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-13">A.5.2.
										Changes in MySQL Connector/J 2.0.13 (2002-04-24)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-12">A.5.3.
										Changes in MySQL Connector/J 2.0.12 (2002-04-07)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-11">A.5.4.
										Changes in MySQL Connector/J 2.0.11 (2002-01-27)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-10">A.5.5.
										Changes in MySQL Connector/J 2.0.10 (2002-01-24)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-9">A.5.6.
										Changes in MySQL Connector/J 2.0.9 (2002-01-13)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-8">A.5.7.
										Changes in MySQL Connector/J 2.0.8 (2001-11-25)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-7">A.5.8.
										Changes in MySQL Connector/J 2.0.7 (2001-10-24)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-6">A.5.9.
										Changes in MySQL Connector/J 2.0.6 (2001-06-16)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-5">A.5.10.
										Changes in MySQL Connector/J 2.0.5 (2001-06-13)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-3">A.5.11.
										Changes in MySQL Connector/J 2.0.3 (2000-12-03)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0-1">A.5.12.
										Changes in MySQL Connector/J 2.0.1 (2000-04-06)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0pre5">A.5.13.
										Changes in MySQL Connector/J 2.0.0pre5 (21 February 2000)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0pre4">A.5.14.
										Changes in MySQL Connector/J 2.0.0pre4 (10 January 2000)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-2-0pre">A.5.15.
										Changes in MySQL Connector/J 2.0.0pre (17 August 1999)</a></span>
							</dt>
						</dl>
					</dd>
					<dt>
						<span class="section"><a href="#cj-news-1-2-x">A.6.
								Changes in MySQL Connector/J 1.2.x and lower</a></span>
					</dt>
					<dd>
						<dl>
							<dt>
								<span class="section"><a href="#cj-news-1-2b">A.6.1.
										Changes in MySQL Connector/J 1.2b (04 July 1999)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-2a">A.6.2.
										Changes in MySQL Connector/J 1.2a (14 April 1999)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1i">A.6.3.
										Changes in MySQL Connector/J 1.1i (24 March 1999)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1h">A.6.4.
										Changes in MySQL Connector/J 1.1h (08 March 1999)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1g">A.6.5.
										Changes in MySQL Connector/J 1.1g (19 February 1999)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1f">A.6.6.
										Changes in MySQL Connector/J 1.1f (31 December 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1b">A.6.7.
										Changes in MySQL Connector/J 1.1b (03 November 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-1">A.6.8.
										Changes in MySQL Connector/J 1.1 (02 September 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-1-0">A.6.9.
										Changes in MySQL Connector/J 1.0 (24 August 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-0-9d">A.6.10.
										Changes in MySQL Connector/J 0.9d (04 August 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-0-9">A.6.11.
										Changes in MySQL Connector/J 0.9 (28 July 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-0-8">A.6.12.
										Changes in MySQL Connector/J 0.8 (06 July 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-0-7">A.6.13.
										Changes in MySQL Connector/J 0.7 (01 July 1998)</a></span>
							</dt>
							<dt>
								<span class="section"><a href="#cj-news-0-6">A.6.14.
										Changes in MySQL Connector/J 0.6 (21 May 1998)</a></span>
							</dt>
						</dl>
					</dd>
				</dl>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-5-1-x"></a>A.1. Changes in MySQL Connector/J
								5.1.x
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-5-1-22">A.1.1.
									Changes in MySQL Connector/J 5.1.22 (Not yet released)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-21">A.1.2.
									Changes in MySQL Connector/J 5.1.21 (2012-07-03)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-20">A.1.3.
									Changes in MySQL Connector/J 5.1.20 (2012-05-01)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-19">A.1.4.
									Changes in MySQL Connector/J 5.1.19 (April 2012)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-18">A.1.5.
									Changes in MySQL Connector/J 5.1.18 (2011-10-04)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-17">A.1.6.
									Changes in MySQL Connector/J 5.1.17 (2011-07-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-16">A.1.7.
									Changes in MySQL Connector/J 5.1.16 (Not released)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-15">A.1.8.
									Changes in MySQL Connector/J 5.1.15 (2011-02-09)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-14">A.1.9.
									Changes in MySQL Connector/J 5.1.14 (6th December 2010)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-13">A.1.10.
									Changes in MySQL Connector/J 5.1.13 (2010-06-24)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-12">A.1.11.
									Changes in MySQL Connector/J 5.1.12 (2010-02-18)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-11">A.1.12.
									Changes in MySQL Connector/J 5.1.11 (2010-01-21)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-10">A.1.13.
									Changes in MySQL Connector/J 5.1.10 (2009-09-23)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-9">A.1.14.
									Changes in MySQL Connector/J 5.1.9 (2009-09-21)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-8">A.1.15.
									Changes in MySQL Connector/J 5.1.8 (2009-07-16)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-7">A.1.16.
									Changes in MySQL Connector/J 5.1.7 (2008-10-21)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-6">A.1.17.
									Changes in MySQL Connector/J 5.1.6 (2008-03-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-5">A.1.18.
									Changes in MySQL Connector/J 5.1.5 (2007-10-09)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-4">A.1.19.
									Changes in MySQL Connector/J 5.1.4 (Not Released)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-3">A.1.20.
									Changes in MySQL Connector/J 5.1.3 (2007-09-10)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-2">A.1.21.
									Changes in MySQL Connector/J 5.1.2 (2007-06-29)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-1">A.1.22.
									Changes in MySQL Connector/J 5.1.1 (2007-06-22)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-1-0">A.1.23.
									Changes in MySQL Connector/J 5.1.0 (2007-04-11)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-22"></a>A.1.1. Changes in MySQL
									Connector/J 5.1.22 (Not yet released)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.21.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="bold"><strong>Performance</strong></span>: The
									<code class="literal">com.mysql.jdbc.getCharsetNameForIndex()</code>
									method was made more efficient, resulting in better performance
									for queries against tables containing many columns with string
									data types. (Bug #14236302, Bug #65508)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">LoadBalancingConnectionProxy.pickNewConnection()</code>
									method could incorrectly flag the current connection as invalid
									after testing another connection. The selection process could
									choose another (potentially offline) host, leading to a <span
										class="quote">“<span class="quote">connection is
											closed</span>”
									</span> error when trying to use a connection after re-balancing:
								</p>
								<pre class="programlisting">No operations allowed after connection closed.
Connection closed after inability to pick valid new connection during fail-over.</pre>
								<p>(Bug #14563127)</p></li>
							<li class="listitem"><p>
									With
									<code class="literal">profileSQL=true</code>
									and
									<code class="literal">useNanosForElapsedTime=true</code>
									specified in the connection URL, query and fetch duration were
									not reported correctly. The
									<code class="literal">com.mysql.jdbc.MysqlIO.sqlQueryDirect()</code>
									method always measured times in milliseconds rather than
									switching between milliseconds and nanoseconds. (Bug #14273046,
									Bug #57662)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet</code>
									objects created by the
									<code class="literal">getGeneratedKeys()</code>
									method were not being automatically closed, leading to
									potential memory leaks if the application did not explicitly
									close the
									<code class="literal">ResultSet</code>
									objects. (Bug #14192873, Bug #65503)
								</p></li>
							<li class="listitem"><p>
									Implemented the
									<code class="literal">getVersionColumns()</code>
									method, which formerly always returned an empty result set. Now
									this method returns the timestamp columns that are updated
									every time a row is changed. (Bug #13636546, Bug #63800)
								</p></li>
							<li class="listitem"><p>
									Connecting to a server that used a
									<code class="literal">UCS2</code>
									character set would throw an exception:
								</p>
								<pre class="programlisting">com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error 
in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near '??' at line 1 </pre>
								<p>
									Now, Connector/J sets
									<code class="literal">characterEncoding</code>
									implicitly to
									<code class="literal">UTF-8</code>
									when the server character set is
									<code class="literal">UCS2</code>
									. Because the Connector/J UTF-8 implementation does not cover
									all UCS-2 characters, note that truncation might occur in some
									cases. (Bug #11751035, Bug #41752)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-21"></a>A.1.2. Changes in MySQL
									Connector/J 5.1.21 (2012-07-03)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.20.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="bold"><strong>InnoDB</strong></span>: Connector/J
									applications can now connect to MySQL servers that use the PAM
									authentication system. See <a class="xref"
										href="#connector-j-using-pam"
										title="5.6. Connecting Using PAM Authentication">Section 5.6,
										“Connecting Using PAM Authentication”</a> for details about the
									Connector/J support, and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/pam-authentication-plugin.html"
										target="_top">The PAM Authentication Plugin</a> for
									information about this authentication feature of the MySQL
									server.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									With a connection encoding of
									<code class="literal">gbk</code>
									and a server encoding of
									<code class="literal">latin1</code>
									, a call such as
									<code class="literal">PreparedStatement.setString(1,
										"0f0f0702")</code>
									could throw an exception
									<code class="literal">java.lang.StringIndexOutOfBoundsException</code>
									. (Bug #13943893, Bug #64731)
								</p></li>
							<li class="listitem"><p>When Connector/J was connected
									to a MySQL 5.5 server, the error message for an invalid query
									could be returned in the wrong character set and appear
									garbled. (Bug #13702427, Bug #64205)</p></li>
							<li class="listitem"><p>
									The timezone entry was missing for <span class="quote">“<span
										class="quote">MEST - Middle European Summer Time</span>”
									</span>. (Bug #11748548, Bug #36662)
								</p></li>
							<li class="listitem"><p>
									Specifying a non-existent character set in the
									<code class="literal">characterEncoding</code>
									or
									<code class="literal">characterSetResults</code>
									connection options could produce a
									<code class="literal">NullPointerException</code>
									error. The error could occur with a typographical mistake, such
									as using a hyphen instead of an underscore in the name. (Bug
									#11749010, Bug #37931)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-20"></a>A.1.3. Changes in MySQL
									Connector/J 5.1.20 (2012-05-01)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.19.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="bold"><strong>Important Change</strong></span>:
									This fix corrects an issue introduced in Connector/J 5.1.19
									that caused connection errors with MySQL 4.1 and earlier
									servers. A
									<code class="literal">java.lang.ClassCastException</code>
									exception occurred during connection initialization when
									<code class="literal">com.mysql.jdbc.ConnectionImpl.buildCollationMapping()</code>
									interpreted the output of the
									<code class="literal">SHOW COLLATION</code>
									statement. (Bug #13958793)
								</p></li>
							<li class="listitem"><p>
									Using Connector/J 5.1.19 in combination with JBoss could result
									in an error while establishing a connection:
									<code class="literal">MySQLNonTransientConnectionException:
										Bad handshake</code>
									. This issue occurred when using the old-style password hash,
									which requires the
									<code class="literal">mysql_old_password</code>
									plugin during handshake. A workaround was to replace the
									16-byte hash with a 41-byte one, as explained in <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/password-hashing.html"
										target="_top">Password Hashing in MySQL</a>. (Bug #13990612,
									Bug #64983)
								</p></li>
							<li class="listitem"><p>
									A
									<code class="literal">java.lang.StringIndexOutOfBoundsException</code>
									exception could occur when manipulating date/time values with
									fractional seconds. (Bug #13960556)
								</p></li>
							<li class="listitem"><p>
									A
									<code class="literal">MySQLSyntaxErrorException</code>
									could occur when calling certain methods while connected to a
									MySQL 5.6.5 or higher server. Affected methods included
									<code class="literal">StatementImpl.execute()</code>
									and
									<code class="literal">PreparedStatement.execute()</code>
									. (Bug #13955027)
								</p></li>
							<li class="listitem"><p>
									The savepoint identifier generated by the
									<code class="literal">java.sql.Connection#.setSavepoint()</code>
									function could be misinterpreted as a floating-point number,
									for example values such as
									<code class="literal">123e10</code>
									or
									<code class="literal">123e10foo</code>
									. Such values could cause replication errors on slave servers
									because the values are not quoted in the binary log. The fix
									ensures that the savepoint identifiers do not begin with
									digits. (Bug #11763271, Bug #55962)
								</p></li>
							<li class="listitem"><p>
									If the string
									<code class="literal">limit</code>
									was used in a column name, prepared statements incorrectly
									treated the statement as if it used a
									<code class="literal">LIMIT</code>
									clause. For example, a prepared statement with
									<code class="literal">maxrows</code>
									set to 0 could incorrectly reuse the value from a previous call
									to
									<code class="literal">setMaxRows()</code>
									. This issue applied to both quoted and unquoted column names,
									and server-side and client-side prepared statements. (Bug
									#11748492, Bug #36478)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-19"></a>A.1.4. Changes in MySQL
									Connector/J 5.1.19 (April 2012)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.18.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added support for pluggable authentication. via the
									<code class="literal">com.mysql.jdbc.AuthenticationPlugin</code>
									interface (which extends the standard <span class="quote">“<span
										class="quote">extension</span>”
									</span> interface). Examples are in
									<code class="filename">com/mysql/jdbc/authentication</code>
									and in
									<code class="literal">testsuite.regression.ConnectionRegressionTest.</code>
									This feature introduces three new connection properties:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">authenticationPlugins</code>
												defines a comma-delimited list of classes that implement
												<code class="literal">com.mysql.jdbc.AuthenticationPlugin</code>
												and are used for authentication unless disabled by the
												<code class="literal">disabledAuthenticationPlugins</code>
												property.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">disabledAuthenticationPlugins</code>
												defines a comma-delimited list of classes implementing
												<code class="literal">com.mysql.jdbc.AuthenticationPlugin</code>
												or mechanisms, i.e.
												<code class="literal">mysql_native_password</code>
												. The authentication plugins or mechanisms cannot be used
												for authentication. Authentication will fail if it requires
												one of these classes. It is an error to disable the default
												authentication plugin, either the one named by
												<code class="literal">defaultAuthenticationPlugin</code>
												property or the hardcoded one if
												<code class="literal">defaultAuthenticationPlugin</code>
												property is not set.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">defaultAuthenticationPlugin</code>
												defines the name of a class implementing
												<code class="literal">com.mysql.jdbc.AuthenticationPlugin</code>
												, which is used as the default authentication plugin. It is
												an error to use a class that is not listed in
												<code class="literal">authenticationPlugins</code>
												and is not one of the built-in plugins. It is an error to
												set as default a plugin that is disabled by being listed in
												the
												<code class="literal">disabledAuthenticationPlugins</code>
												property. It is an error to set this value to null or the
												empty string; there must be at least one valid default
												authentication plugin specified for the connection, meeting
												all the constraints listed above.
											</p></li>
									</ul>
								</div></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Reduced the memory overhead for server-side prepared
									statements. Each prepared statement allocated a 4K buffer for
									converting streams. Now this allocation is skipped when no
									<code class="literal">set*Stream()</code>
									methods have been used.
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">Connection.changeUser()</code>
									method did not check for closed connections, leading to
									<code class="literal">NullPointerException</code>
									errors when this method was called on a closed connection.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-18"></a>A.1.5. Changes in MySQL
									Connector/J 5.1.18 (2011-10-04)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.17.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added the function
									<code class="literal">MYSQL_INDEX_TO_MYSQL_CHARSET</code>
									to retrieve the server charset name, using an index instead of
									parsing variables to
									<code class="literal">CharsetMapping.java</code>
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									The
									<code class="literal">LRUCache</code>
									implementation removed the eldest entry, rather than the
									least-recently accessed. (Bug #13036537)
								</p></li>
							<li class="listitem"><p>
									Changed
									<code class="literal">cacheCallableStatements</code>
									to
									<code class="literal">cacheCallableStmts</code>
									in
									<code class="literal">maxPerformance.properties</code>
									, to allow proper caching. (Bug #13036309)
								</p></li>
							<li class="listitem"><p>
									Added a new
									<code class="literal">ant</code>
									flag,
									<code class="literal">com.mysql.jdbc.junit.fork</code>
									, which controls whether
									<code class="literal">JUnit</code>
									will fork new processes.
								</p>
								<p>
									The value
									<code class="literal">on</code>
									: The default, and legacy behavior. Or
									<code class="literal">off</code>
									): Required for Windows, as otherwise
									<code class="literal">process fork failure</code>
									errors will result while running the test suite via
									<code class="literal">ant</code>
									on Windows. (Bug #12784170)
								</p></li>
							<li class="listitem"><p>
									Not putting a space between <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_values"
										target="_top"><code class="literal">VALUES()</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html"
										target="_top"><code class="literal">ON DUPLICATE
											KEY UPDATE</code></a> causes connector/J to both (A) Rewrite the query,
									although it includes an
									<code class="literal">ON UPDATE</code>
									statement and (B) To generate the wrong query with multiple <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html"
										target="_top"><code class="literal">ON DUPLICATE
											KEY</code></a> statements. (Bug #12565726)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">loadBalanceBlacklistTimeout</code>
									option was not functioning properly. Working connections were
									not being removed from the blacklist. (Bug #63135)
								</p></li>
							<li class="listitem"><p>
									Connector/J now guards against the condition where a call to <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/kill.html"
										target="_top"><code class="literal">KILL QUERY</code></a> will
									kill the next query issued by the server, if no query is in
									process. (Bug #61501)
								</p></li>
							<li class="listitem"><p>
									The "old" warnings were returned when
									<code class="literal">Statement.getWarnings()</code>
									was called after
									<code class="literal">Statement.clearWarnings()</code>
									. (Bug #61866, Bug #12791594)
								</p></li>
							<li class="listitem"><p>
									Calling
									<code class="literal">Statement.cancel()</code>
									on a statement that isn't currently executing, will cause a
									later-executed query on the same connection to be unexpectedly
									canceled. The driver now guards against this condition, but it
									is an underlying server issue. The MySQL statement <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/kill.html"
										target="_top"><code class="literal">KILL QUERY</code></a>
									(which is what the driver uses to implement
									<code class="literal">Statement.cancel()</code>
									) is rather non-deterministic, and thus the use of
									<code class="literal">Statement.cancel()</code>
									should be avoided if possible. (Bug #61501)
								</p></li>
							<li class="listitem"><p>
									A connection could not be established when the <acronym
										class="acronym">URL</acronym> contained both
									<code class="literal">sessionVariables</code>
									and
									<code class="literal">characterEncoding</code>
									. (Bug #61201, Bug #12649557)
								</p></li>
							<li class="listitem"><p>
									Reverting changes made to
									<code class="literal">ConnectionImpl.java</code>
									, the
									<code class="literal">private boolean
										characterSetNamesMatches</code>
									function.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-17"></a>A.1.6. Changes in MySQL
									Connector/J 5.1.17 (2011-07-07)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.16.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like"
										target="_top"><code class="literal">LIKE</code></a> was not
									optimized in then server when run against
									<code class="literal">INFORMATION_SCHEMA</code>
									tables and no wildcards were used. Databases/tables with
									<code class="literal">'_'</code>
									or
									<code class="literal">'%'</code>
									in their names (escaped or not) are handled by this code path,
									although slower, since it is rare to find these characters in
									table names in SQL. If there is a
									<code class="literal">'_'</code>
									or
									<code class="literal">'%'</code>
									in the string, <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like"
										target="_top"><code class="literal">LIKE</code></a> takes care
									of that; otherwise,
									<code class="literal">'='</code>
									is now used instead. The only exception is the
									<code class="literal">information_schema</code>
									database, which is handled separately. The patch covers both
									<code class="literal">getTables()</code>
									and
									<code class="literal">getColumns()</code>
									. (Bug #61332)
								</p></li>
							<li class="listitem"><p>
									The first call to a stored procedure failed with <span
										class="quote">“<span class="quote">No Database
											Selected</span>”
									</span>. The workaround introduced in
									<code class="literal">DatabaseMetaData.getCallStmtParameterTypes</code>
									to fix the server bug where <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-create-procedure.html"
										target="_top"><code class="literal">SHOW CREATE
											PROCEDURE</code></a> was not respecting lowercase table names was
									misbehaving when the connection was not attached to a database
									and on case-insensitive operating systems. (Bug #61150)
								</p></li>
							<li class="listitem"><p>
									There was a concurrency bottleneck in Java's character set
									encoding/decoding when converting bytes to/from
									<code class="literal">String</code>
									values.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="important"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Important</div>
									<p xmlns="">
										No longer use
										<code class="literal">String.getBytes(...)</code>
										, or
										<code class="literal">new String(byte[]...)</code>
										. Use the
										<code class="literal">StringUtils</code>
										method instead.
									</p>
								</div>
								<p>(Bug #61105)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-16"></a>A.1.7. Changes in MySQL
									Connector/J 5.1.16 (Not released)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.15.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									The
									<code class="literal">Connection.isServerLocal()</code>
									method can now determine if a connection is against a server on
									the same host.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-15"></a>A.1.8. Changes in MySQL
									Connector/J 5.1.15 (2011-02-09)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.14.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Optional logging class
									<code class="literal">com.mysql.jdbc.log.Log4JLogger</code>
									was not included in the source/binary package for 5.1.14.
								</p>
								<p>5.1.15 will ship with an SLF4J logger (which can then be
									plugged into Log4J). Unfortunately, it is not possible to ship
									a direct Log4J integration because the GPL is not compatible
									with Log4J's license. (Bug #59511, Bug #11766408)</p></li>
							<li class="listitem"><p>The hard-coded list of reserved
									words in Connector/J was not updated to reflect the list of
									reserved words in MySQL Server 5.5. (Bug #59224)</p></li>
							<li class="listitem"><p>MySqlProcedure accepted null
									arguments as parameters, however the JDBC meta data did not
									indicate that. (Bug #38367, Bug #11749186)</p></li>
							<li class="listitem"><p>Using Connector/J to connect
									from a z/OS machine to a MySQL Server failed when the database
									name to connect to was included in the connection URL. This was
									because the name was sent in z/OS default platform encoding,
									but the MySQL Server expected Latin1.</p>
								<p>
									It should be noted that when connecting from systems that do
									not use Latin1 as the default platform encoding, the following
									connection string options can be useful:
									<code class="literal">passwordCharacterEncoding=ASCII</code>
									and
									<code class="literal">characterEncoding=ASCII</code>
									. (Bug #18086, Bug #11745647)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-14"></a>A.1.9. Changes in MySQL
									Connector/J 5.1.14 (6th December 2010)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.13.</p>
					<p>Version 5.1.14 has no changelog entries.</p>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-13"></a>A.1.10. Changes in MySQL
									Connector/J 5.1.13 (2010-06-24)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.12.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Connector/J did not support
									<code class="literal">utf8mb4</code>
									for servers 5.5.2 and newer.
								</p>
								<p>
									Connector/J now auto-detects servers configured with
									<code class="literal">character_set_server=utf8mb4</code>
									or treats the Java encoding
									<code class="literal">utf-8</code>
									passed using
									<code class="literal">characterEncoding=...</code>
									as
									<code class="literal">utf8mb4</code>
									in the
									<code class="literal">SET NAMES=</code>
									calls it makes when establishing the connection. (Bug #54175)
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When the
									<code class="literal">allowMultiQueries</code>
									connection string option was set to
									<code class="literal">true</code>
									, a call to
									<code class="literal">Statement.executeBatch()</code>
									scanned the query for escape codes, even though
									<code class="literal">setEscapeProcessing(false)</code>
									had been called previously. (Bug #51704)
								</p></li>
							<li class="listitem"><p>
									The method
									<code class="literal">unSafeStatementInterceptors()</code>
									contained an erroneous line of code, which resulted in the
									interceptor being called, but the result being thrown away.
									(Bug #53041)
								</p></li>
							<li class="listitem"><p>There was a performance
									regression of roughly 25% between r906 and r907, which appeared
									to be caused by pushing the Proxy down to the I/O layer. (Bug
									#52534)</p></li>
							<li class="listitem"><p>
									In the file
									<code class="filename">DatabaseMetadata.java</code>
									, the function
									<code class="literal">private void
										getCallStmtParameterTypes</code>
									failed if the parameter was defined over more than one line by
									using the '\n' character. (Bug #52167)
								</p></li>
							<li class="listitem"><p>
									The catalog parameter,
									<code class="literal">PARAM_CAT</code>
									, was not correctly processed when calling for metadata with
									<code class="literal">getMetaData()</code>
									on stored procedures. This was because
									<code class="literal">PARAM_CAT</code>
									was hardcoded in the code to
									<code class="literal">NULL</code>
									. In the case where
									<code class="literal">nullcatalogmeanscurrent</code>
									was
									<code class="literal">true</code>
									, which is its default value, a crash did not occur, but the
									metadata returned was for the stored procedures from the
									catalog currently attached to. If, however,
									<code class="literal">nullcatalogmeanscurrent</code>
									was set to
									<code class="literal">false</code>
									then a crash resulted.
								</p>
								<p>
									Connector/J has been changed so that when
									<code class="literal">NULL</code>
									is passed as
									<code class="literal">PARAM_CAT</code>
									it will not crash when
									<code class="literal">nullcatalogmeanscurrent</code>
									is
									<code class="literal">false</code>
									, but rather iterate all catalogs in search of stored
									procedures. This means that
									<code class="literal">PARAM_CAT</code>
									is no longer hardcoded to
									<code class="literal">NULL</code>
									(see Bug #51904). (Bug #51912)
								</p></li>
							<li class="listitem"><p>
									Logic in implementations of
									<code class="literal">LoadBalancingConnectionProxy</code>
									and
									<code class="literal">LoadBalanceStrategy</code>
									behaved differently as to which
									<code class="literal">SQLException</code>
									s trigger failover to a new host. The former looked at the
									first two characters of the SQLState:
								</p>
								<pre class="programlisting">if (sqlState.startsWith("08"))
...</pre>
								<p>The latter used a different test:</p>
								<pre class="programlisting">if (sqlEx instanceof CommunicationsException
  || "08S01".equals(sqlEx.getSQLState())) {
...</pre>
								<p>
									This meant it was possible for a new
									<code class="literal">Connection</code>
									object to throw an
									<code class="literal">Exception</code>
									when the first selected host was unavailable. This happened
									because
									<code class="literal">MySqlIO.createNewIO()</code>
									could throw an
									<code class="literal">SQLException</code>
									with a
									<code class="literal">SQLState</code>
									of <span class="quote">“<span class="quote">08001</span>”
									</span>, which did not trigger the <span class="quote">“<span
										class="quote">try another host</span>”
									</span> logic in the
									<code class="literal">LoadBalanceStrategy</code>
									implementations, so an
									<code class="literal">Exception</code>
									was thrown after having only attempted connecting to a single
									host. (Bug #52231)
								</p></li>
							<li class="listitem"><p>
									A load balanced
									<code class="literal">Connection</code>
									object with multiple open underlying physical connections
									rebalanced on
									<code class="literal">commit()</code>
									,
									<code class="literal">rollback()</code>
									, or on a communication exception, without validating the
									existing connection. This caused a problem when there was no
									pinging of the physical connections, using queries starting
									with <span class="quote">“<span class="quote">/*
											ping */</span>”
									</span>, to ensure they remained active. This meant that calls to
									<code class="literal">Connection.commit()</code>
									could throw a
									<code class="literal">SQLException</code>
									. This did not occur when the transaction was actually
									committed; it occurred when the new connection was chosen and
									the driver attempted to set the auto-commit or transaction
									isolation state on the newly chosen physical connection. (Bug
									#51783)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">rollback()</code>
									method could fail to rethrow a
									<code class="literal">SQLException</code>
									if the server became unavailable during a rollback. The errant
									code only rethrew when
									<code class="literal">ignoreNonTxTables</code>
									was true and the exception did not have the error code 1196,
									<code class="literal">SQLError.ER_WARNING_NOT_COMPLETE_ROLLBACK</code>
									. (Bug #51776)
								</p></li>
							<li class="listitem"><p>
									Objects created by
									<code class="literal">ConnectionImpl</code>
									, such as prepared statements, hold a reference to the
									<code class="literal">ConnectionImpl</code>
									that created them. However, when the load balancer picked a new
									connection, it did not update the reference contained in, for
									example, the
									<code class="literal">PreparedStatement</code>
									. This resulted in inserts and updates being directed to
									invalid connections, while commits were directed to the new
									connection. This resulted in silent data loss. (Bug #51643)
								</p></li>
							<li class="listitem"><p>
									When a
									<code class="literal">StatementInterceptor</code>
									was used and an alternate
									<code class="literal">ResultSet</code>
									was returned from
									<code class="literal">preProcess()</code>
									, the original statement was still executed. (Bug #51666)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">jdbc:mysql:loadbalance://</code>
									would connect to the same host, even though
									<code class="literal">loadBalanceStrategy</code>
									was set to a value of
									<code class="literal">random</code>
									, and multiple hosts were specified. (Bug #51266)
								</p></li>
							<li class="listitem"><p>
									An unexpected exception when trying to register
									<code class="literal">OUT</code>
									parameters in
									<code class="literal">CallableStatement</code>
									.
								</p>
								<p>
									Sometimes Connector/J was not able to register
									<code class="literal">OUT</code>
									parameters for
									<code class="literal">CallableStatements</code>
									. (Bug #43576)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-12"></a>A.1.11. Changes in MySQL
									Connector/J 5.1.12 (2010-02-18)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.11.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									The catalog parameter was ignored in the
									<code class="literal">DatabaseMetaData.getProcedure()</code>
									method. It returned all procedures in all databases. (Bug
									#51022)
								</p></li>
							<li class="listitem"><p>
									A call to
									<code class="literal">DatabaseMetaData.getDriverVersion()</code>
									returned the revision as
									<code class="literal">mysql-connector-java-5.1.11 (
										Revision: ${svn.Revision} )</code>
									. The variable
									<code class="literal">${svn.Revision}</code>
									was not replaced by the SVN revision number. (Bug #50288)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-11"></a>A.1.12. Changes in MySQL
									Connector/J 5.1.11 (2010-01-21)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.10.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Replication connections, those with URLs that start with
									jdbc:mysql:replication, now use a jdbc:mysql:loadbalance
									connection for the slave pool. This means that it is possible
									to set load balancing properties such as
									<code class="literal">loadBalanceBlacklistTimeout</code>
									and
									<code class="literal">loadBalanceStrategy</code>
									to choose a mechanism for balancing the load, and failover or
									fault tolerance strategy for the slave pool. (Bug #49537)
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">NullPointerException</code>
									sometimes occurred in
									<code class="literal">invalidateCurrentConnection()</code>
									for load-balanced connections. (Bug #50288)
								</p></li>
							<li class="listitem"><p>
									For pooled connections, Connector/J did not process the session
									variable
									<code class="literal">time_zone</code>
									when set using the URL, resulting in incorrect timestamp values
									being stored. (Bug #49700)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">deleteRow</code>
									method caused a full table scan, when using an updatable cursor
									and a multi-byte character set. (Bug #49745)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">ExceptionInterceptor</code>
									class did not provide a
									<code class="literal">Connection</code>
									context. (Bug #49607)
								</p></li>
							<li class="listitem"><p>Ping left closed connections in
									the liveConnections map, causing subsequent Exceptions when
									that connection was used. (Bug #48605)</p></li>
							<li class="listitem"><p>
									Using
									<code class="literal">MysqlConnectionPoolDataSource</code>
									with a load-balanced URL generated exceptions of type
									<code class="literal">ClassCastException</code>
									:
								</p>
								<pre class="programlisting">ClassCastException in MysqlConnectionPoolDataSource
Caused by: java.lang.ClassCastException: $Proxy0
   at
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource.getPooledConnection(MysqlConne
ctionPoolDataSource.java:80)</pre>
								<pre class="programlisting">java.lang.ClassCastException: $Proxy2
 at com.mysql.jdbc.jdbc2.optional.StatementWrapper.executeQuery(StatementWrapper.java:744)</pre>
								<p>(Bug #48486)</p></li>
							<li class="listitem"><p>
									The implementation for load-balanced
									<code class="literal">Connection</code>
									used a proxy, which delegated method calls, including
									<code class="literal">equals()</code>
									and
									<code class="literal">hashCode()</code>
									, to underlying
									<code class="literal">Connection</code>
									objects. This meant that successive calls to
									<code class="literal">hashCode()</code>
									on the same object potentially returned different values, if
									the proxy state had changed such that it was utilizing a
									different underlying connection. (Bug #48442)
								</p></li>
							<li class="listitem"><p>
									The batch rewrite functionality attempted to identify the start
									of the
									<code class="literal">VALUES</code>
									list by looking for <span class="quote">“<span
										class="quote">VALUES </span>”
									</span> (with trailing space). However, valid MySQL syntax permits
									<code class="literal">VALUES</code>
									to be followed by whitespace or an opening parenthesis:
								</p>
								<pre class="programlisting">INSERT INTO tbl VALUES
(1);

INSERT INTO tbl VALUES(1);</pre>
								<p>Queries written with the above formats did not therefore
									gain the performance benefits of the batch rewrite. (Bug
									#48172)</p></li>
							<li class="listitem"><p>
									A PermGen memory leaked was caused by the Connector/J statement
									cancellation timer (
									<code class="literal">java.util.Timer</code>
									). When the application was unloaded the cancellation timer did
									not terminate, preventing the ClassLoader from being garbage
									collected. (Bug #36565)
								</p></li>
							<li class="listitem"><p>
									With the connection string option
									<code class="literal">noDatetimeStringSync</code>
									set to
									<code class="literal">true</code>
									, and server-side prepared statements enabled, the following
									exception was generated if an attempt was made to obtain, using
									<code class="literal">ResultSet.getString()</code>
									, a datetime value containing all zero components:
								</p>
								<pre class="programlisting">java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date</pre>
								<p>(Bug #32525)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-10"></a>A.1.13. Changes in MySQL
									Connector/J 5.1.10 (2009-09-23)
								</h3>
							</div>
						</div>
					</div>
					<p>Fixes bugs found since release 5.1.9.</p>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									The
									<code class="literal">DriverManager.getConnection()</code>
									method ignored a non-standard port if it was specified in the
									JDBC connection string. Connector/J always used the standard
									port 3306 for connection creation. For example, if the string
									was
									<code class="literal">jdbc:mysql://localhost:6777</code>
									, Connector/J would attempt to connect to port 3306, rather
									than 6777. (Bug #47494)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-9"></a>A.1.14. Changes in MySQL
									Connector/J 5.1.9 (2009-09-21)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When Connector/J encountered an error condition that caused it
									to create a
									<code class="literal">CommunicationsException</code>
									, it tried to build a friendly error message that helped
									diagnose what was wrong. However, if there had been no network
									packets received from the server, the error message contained
									the following incorrect text:
								</p>
								<pre class="programlisting">The last packet successfully received from the server was 1,249,932,468,916 milliseconds
ago.  The last packet sent successfully to the server was 0 milliseconds ago.</pre>
								<p>(Bug #46637)</p></li>
							<li class="listitem"><p>
									In the class
									<code class="literal">com.mysql.jdbc.jdbc2.optional.SuspendableXAConnection</code>
									, which is used when
									<code class="literal">pinGlobalTxToPhysicalConnection=true</code>
									, there is a static map (XIDS_TO_PHYSICAL_CONNECTIONS) that
									tracks the Xid with the XAConnection, however this map was not
									populated. The effect was that the
									<code class="literal">SuspendableXAConnection</code>
									was never pinned to the real XA connection. Instead it created
									new connections on calls to
									<code class="literal">start</code>
									,
									<code class="literal">end</code>
									,
									<code class="literal">resume</code>
									, and
									<code class="literal">prepare</code>
									. (Bug #46925)
								</p></li>
							<li class="listitem"><p>When using the ON DUPLICATE KEY
									UPDATE functionality together with the rewriteBatchedStatements
									option set to true, an exception was generated when trying to
									execute the prepared statement:</p>
								<pre class="programlisting">INSERT INTO config_table (modified,id_) VALUES (?,?) ON DUPLICATE KEY UPDATE modified=?</pre>
								<p>The exception generated was:</p>
								<pre class="programlisting">java.sql.SQLException: Parameter index out of range (3 &gt; number of parameters, which is
2).
  at com.sag.etl.job.processors.JdbcInsertProcessor.flush(JdbcInsertProcessor.java:135)
......
Caused by: java.sql.SQLException: Parameter index out of range (3 &gt; number of parameters,
which is 2).
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
  at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3657)
  at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3641)
  at
com.mysql.jdbc.PreparedStatement.setBytesNoEscapeNoQuotes(PreparedStatement.java:3391)
  at
com.mysql.jdbc.PreparedStatement.setOneBatchedParameterSet(PreparedStatement.java:4203)
  at com.mysql.jdbc.PreparedStatement.executeBatchedInserts(PreparedStatement.java:1759)
  at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1441)
  at com.sag.etl.job.processors.JdbcInsertProcessor.flush(JdbcInsertProcessor.java:131)
  ... 16 more</pre>
								<p>(Bug #46788)</p></li>
							<li class="listitem"><p>Accessing result set columns by
									name after the result set had been closed resulted in a
									NullPointerException instead of a SQLException. (Bug #41484)</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">getSuperTypes</code>
									method returned a result set with incorrect names for the first
									two columns. The name of the first column in the result set was
									expected to be
									<code class="literal">TYPE_CAT</code>
									and that of the second column
									<code class="literal">TYPE_SCHEM</code>
									. The method however returned the names as
									<code class="literal">TABLE_CAT</code>
									and
									<code class="literal">TABLE_SCHEM</code>
									for first and second column respectively. (Bug #44508)
								</p></li>
							<li class="listitem"><p>
									Calling
									<code class="literal">ResultSet.deleteRow()</code>
									on a table with a primary key of type
									<code class="literal">BINARY(8)</code>
									silently failed to delete the row, but only in some repeatable
									cases. The generated
									<code class="literal">DELETE</code>
									statement generated corrupted part of the primary key data.
									Specifically, one of the bytes was changed from 0x90 to 0x9D,
									although the corruption appeared to be different depending on
									whether the application was run on Windows or Linux. (Bug
									#43759)
								</p></li>
							<li class="listitem"><p>SQLException for data truncation
									error gave the error code as 0 instead of 1265. (Bug #44324)</p></li>
							<li class="listitem"><p>
									<code class="literal">QueryTimeout</code>
									did not work for batch statements waiting on a locked table.
								</p>
								<p>When a batch statement was issued to the server and was
									forced to wait because of a locked table, Connector/J only
									terminated the first statement in the batch when the timeout
									was exceeded, leaving the rest hanging. (Bug #34555)</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">parseURL</code>
									method in class
									<code class="literal">com.mysql.jdbc.Driver</code>
									did not work as expected. When given a URL such as <span
										class="quote">“<span class="quote">jdbc:mysql://www.mysql.com:12345/my_database</span>”
									</span> to parse, the property
									<code class="literal">PORT_PROPERTY_KEY</code>
									was found to be
									<code class="literal">null</code>
									and the
									<code class="literal">HOST_PROPERTY_KEY</code>
									property was found to be <span class="quote">“<span
										class="quote">www.mysql.com:12345</span>”
									</span>.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										Connector/J has been fixed so that it will now always fill in
										the
										<code class="literal">PORT</code>
										property (using 3306 if not specified), and the
										<code class="literal">HOST</code>
										property (using
										<code class="literal">localhost</code>
										if not specified) when
										<code class="literal">parseURL()</code>
										is called. The driver also parses a list of hosts into
										<code class="literal">HOST.n</code>
										and
										<code class="literal">PORT.n</code>
										properties as well as adding a property
										<code class="literal">NUM_HOSTS</code>
										for the number of hosts it has found. If a list of hosts is
										passed to the driver,
										<code class="literal">HOST</code>
										and
										<code class="literal">PORT</code>
										will be set to the values given by
										<code class="literal">HOST.1</code>
										and
										<code class="literal">PORT.1</code>
										respectively. This change has centralized and cleaned up a
										large section of code used to generate lists of hosts, both
										for load-balanced and fault tolerant connections and their
										tests.
									</p>
								</div>
								<p>(Bug #32216)</p></li>
							<li class="listitem"><p>
									Attempting to delete rows using
									<code class="literal">ResultSet.deleteRow()</code>
									did not delete rows correctly. (Bug #27431)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">setDate</code>
									method silently ignored the Calendar parameter. The code was
									implemented as follows:
								</p>
								<pre class="programlisting">public void setDate(int parameterIndex, java.sql.Date x, Calendar cal) throws SQLException {
   setDate(parameterIndex, x);
}        </pre>
								<p>
									From reviewing the code it was apparent that the Calendar
									parameter
									<code class="literal">cal</code>
									was ignored. (Bug #23584)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-8"></a>A.1.15. Changes in MySQL
									Connector/J 5.1.8 (2009-07-16)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Calling
									<code class="literal">Connection.serverPreparedStatement()</code>
									variants that do not take result set type or concurrency
									arguments returned statements that produced result sets with
									incorrect defaults, namely
									<code class="literal">TYPE_SCROLL_SENSITIVE</code>
									. (Bug #45171)
								</p></li>
							<li class="listitem"><p>The reported milliseconds since
									the last server packets were received/sent was incorrect by a
									factor of 1000. For example, the following method call:</p>
								<pre class="programlisting">SQLError.createLinkFailureMessageBasedOnHeuristics(
(ConnectionImpl) this.conn, 
System.currentTimeMillis() - 1000,
System.currentTimeMillis() - 2000,
e, 
false);</pre>
								<p>returned the following string:</p>
								<pre class="programlisting">The last packet successfully received from the server 
was 2 milliseconds ago. The last packet sent successfully to the 
server was 1 milliseconds ago.</pre>
								<p>(Bug #45419)</p></li>
							<li class="listitem"><p>
									The method
									<code class="literal">Statement.getGeneratedKeys()</code>
									did not return values for
									<code class="literal">UNSIGNED BIGINTS</code>
									with values greater than
									<code class="literal">Long.MAX_VALUE</code>
									.
								</p>
								<p>
									Unfortunately, because the server does not tell clients what
									TYPE the auto increment value is, the driver cannot
									consistently return BigIntegers for the result set returned
									from
									<code class="literal">getGeneratedKeys()</code>
									, it will only return them if the value is greater than
									<code class="literal">Long.MAX_VALUE</code>
									. If your application needs this consistency, it will need to
									check the class of the return value from
									<code class="literal">.getObject()</code>
									on the ResultSet returned by
									<code class="literal">Statement.getGeneratedKeys()</code>
									and if it is not a BigInteger, create one based on the
									<code class="literal">java.lang.Long</code>
									that is returned. (Bug #43196)
								</p></li>
							<li class="listitem"><p>A statement interceptor received
									the incorrect parameters when used with a batched statement.
									(Bug #39426)</p></li>
							<li class="listitem"><p>When using Connector/J 5.1.7 to
									connect to MySQL Server 4.1.18 the following error message was
									generated:</p>
								<pre class="programlisting">Thu Dec 11 17:38:21 PST 2008 WARN: Invalid value {1} for server variable named {0},
falling back to sane default of {2}</pre>
								<p>
									This occurred with MySQL Server version that did not support
									<code class="literal">auto_increment_increment</code>
									. The error message should not have been generated. (Bug
									#41416)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">RETURN_GENERATED_KEYS</code>
									flag was being ignored. For example, in the following code the
									<code class="literal">RETURN_GENERATED_KEYS</code>
									flag was ignored:
								</p>
								<pre class="programlisting">PreparedStatement ps = connection.prepareStatement("INSERT INTO table
  values(?,?)",PreparedStatement.RETURN_GENERATED_KEYS);</pre>
								<p>(Bug #41448)</p></li>
							<li class="listitem"><p>
									Using Connector/J 5.1.6 the method
									<code class="literal">ResultSet.getObject</code>
									returned a
									<code class="literal">BYTE[]</code>
									for following:
								</p>
								<pre class="programlisting">SELECT TRIM(rowid) FROM tbl</pre>
								<p>
									Where
									<code class="literal">rowid</code>
									had a type of
									<code class="literal">INT(11) PRIMARY KEY AUTO_INCREMENT</code>
									.
								</p>
								<p>
									The expected return type was one of
									<code class="literal">CHAR</code>
									,
									<code class="literal">VARCHAR</code>
									,
									<code class="literal">CLOB</code>
									, however, a
									<code class="literal">BYTE[]</code>
									was returned.
								</p>
								<p>
									Further, adding
									<code class="literal">functionsNeverReturnBlobs=true</code>
									to the connection string did not have any effect on the return
									type. (Bug #38387)
								</p></li>
							<li class="listitem"><p>
									Connector/J generated an unhandled
									<code class="literal">StringIndexOutOfBoundsException</code>
									:
								</p>
								<pre class="programlisting">java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1938)
at com.mysql.jdbc.EscapeProcessor.processTimeToken(EscapeProcessor.java:353)
at com.mysql.jdbc.EscapeProcessor.escapeSQL(EscapeProcessor.java:257)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1546)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1524)</pre>
								<p>(Bug #42253)</p></li>
							<li class="listitem"><p>
									When using
									<code class="literal">rewriteBatchedStatements=true</code>
									with:
								</p>
								<pre class="programlisting">INSERT INTO table_name_values (...) VALUES (...)</pre>
								<p>
									Query rewriting failed because <span class="quote">“<span
										class="quote">values</span>”
									</span> at the end of the table name was mistaken for the reserved
									keyword. The error generated was as follows:
								</p>
								<pre class="programlisting">testBug40439(testsuite.simple.TestBug40439)java.sql.BatchUpdateException: You have an
error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near 'values (2,'toto',2),(id,data, ordr) values
(3,'toto',3),(id,data, ordr) values (' at line 1
at com.mysql.jdbc.PreparedStatement.executeBatchedInserts(PreparedStatement.java:1495)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1097)
at testsuite.simple.TestBug40439.testBug40439(TestBug40439.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at testsuite.simple.TestBug40439.main(TestBug40439.java:57)</pre>
								<p>(Bug #40439)</p></li>
							<li class="listitem"><p>Error message strings contained
									variable values that were not expanded. For example:</p>
								<pre class="programlisting">Mon Nov 17 11:43:18 JST 2008 WARN: Invalid value {1} for server variable named {0},
falling back to sane default of {2}</pre>
								<p>(Bug #40772)</p></li>
							<li class="listitem"><p>
									When accessing a result set column by name using
									<code class="literal">ResultSetImpl.findColumn()</code>
									an exception was generated:
								</p>
								<pre class="programlisting">java.lang.NullPointerException
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1103)
at com.mysql.jdbc.ResultSetImpl.getShort(ResultSetImpl.java:5415)
at org.apache.commons.dbcp.DelegatingResultSet.getShort(DelegatingResultSet.java:219)
at com.zimbra.cs.db.DbVolume.constructVolume(DbVolume.java:297)
at com.zimbra.cs.db.DbVolume.get(DbVolume.java:197)
at com.zimbra.cs.db.DbVolume.create(DbVolume.java:95)
at com.zimbra.cs.store.Volume.create(Volume.java:227)
at com.zimbra.cs.store.Volume.create(Volume.java:189)
at com.zimbra.cs.service.admin.CreateVolume.handle(CreateVolume.java:48)
at com.zimbra.soap.SoapEngine.dispatchRequest(SoapEngine.java:428)
at com.zimbra.soap.SoapEngine.dispatch(SoapEngine.java:285)</pre>
								<p>(Bug #41484)</p></li>
							<li class="listitem"><p>
									If there was an apostrophe in a comment in a statement that was
									being sent through Connector/J, the apostrophe was still
									recognized as a quote and put the state machine in
									<code class="literal">EscapeTokenizer</code>
									into the
									<code class="literal">inQuotes</code>
									state. This led to further parse errors.
								</p>
								<p>For example, consider the following statement:</p>
								<pre class="programlisting">String sql = "-- Customer's zip code will be fixed\n" +
  "update address set zip_code = 99999\n" +
  "where not regexp '^[0-9]{5}([[.-.]])?([0-9]{4})?$'";</pre>
								<p>
									When passed through Connector/J, the
									<code class="literal">EscapeTokenizer</code>
									did not recognize that the first apostrophe was in a comment
									and thus set
									<code class="literal">inQuotes</code>
									to true. When that happened, the quote count was incorrect and
									thus the regular expression did not appear to be in quotation
									marks. With the parser not detecting that the regular
									expression was in quotation marks, the curly braces were
									recognized as escape sequences and were removed from the
									regular expression, breaking it. The server thus received SQL
									such as:
								</p>
								<pre class="programlisting">-- Customer's zip code will be fixed
update address set zip_code = '99999'
where not regexp '^[0-9]([[.-.]])?([0-9])?$'</pre>
								<p>(Bug #41566)</p></li>
							<li class="listitem"><p>
									Using
									<code class="literal">useInformationSchema</code>
									with
									<code class="literal">DatabaseMetaData.getExportedKeys()</code>
									generated the following exception:
								</p>
								<pre class="programlisting">com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column
'REFERENCED_TABLE_NAME' in where clause is ambiguous
...
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1772)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1923)
at
com.mysql.jdbc.DatabaseMetaDataUsingInfoSchema.executeMetadataQuery(
DatabaseMetaDataUsingInfoSchema.java:50)
at
com.mysql.jdbc.DatabaseMetaDataUsingInfoSchema.getExportedKeys(
DatabaseMetaDataUsingInfoSchema.java:603)</pre>
								<p>(Bug #43714)</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">SQLError.createLinkFailureMessageBasedOnHeuristics()</code>
									method created a message text for communication link failures.
									When certain conditions were met, this message included both <span
										class="quote">“<span class="quote">last packet
											sent</span>”
									</span> and <span class="quote">“<span class="quote">last
											packet received</span>”
									</span> information, but when those conditions were not met, only <span
										class="quote">“<span class="quote">last packet
											sent</span>”
									</span> information was provided.
								</p>
								<p>Information about when the last packet was successfully
									received should be provided in all cases. (Bug #44587)</p></li>
							<li class="listitem"><p>
									When
									<code class="literal">DatabaseMetaData.getProcedureColumns()</code>
									was called, the value for
									<code class="literal">LENGTH</code>
									was always returned as 65535, regardless of the column type
									(fixed or variable) or the actual length of the column.
								</p>
								<p>
									However, if you obtained the
									<code class="literal">PRECISION</code>
									value, this was correct for both fixed and variable length
									columns. (Bug #41269)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">DEFERRABILITY</code>
									column in database metadata result sets was expected to be of
									type
									<code class="literal">SHORT</code>
									. However, Connector/J returned it as
									<code class="literal">INTEGER</code>
									.
								</p>
								<p>
									This affected the following methods:
									<code class="literal">getImportedKeys()</code>
									,
									<code class="literal">getExportedKeys()</code>
									,
									<code class="literal">getCrossReference()</code>
									. (Bug #44867)
								</p></li>
							<li class="listitem"><p>
									The result set returned by
									<code class="literal">getIndexInfo()</code>
									did not have the format defined in the JDBC API specifications.
									The fourth column,
									<code class="literal">DATA_TYPE</code>
									, of the result set should be of type
									<code class="literal">BOOLEAN</code>
									. Connector/J however returns
									<code class="literal">CHAR</code>
									. (Bug #44869)
								</p></li>
							<li class="listitem"><p>
									The result set returned by
									<code class="literal">getTypeInfo()</code>
									did not have the format defined in the JDBC API specifications.
									The second column,
									<code class="literal">DATA_TYPE</code>
									, of the result set should be of type
									<code class="literal">INTEGER</code>
									. Connector/J however returns
									<code class="literal">SMALLINT</code>
									. (Bug #44868)
								</p></li>
							<li class="listitem"><p>
									The result set returned by
									<code class="literal">getColumns()</code>
									did not have the format defined in the JDBC API specifications.
									The fifth column,
									<code class="literal">DATA_TYPE</code>
									, of the result set should be of type
									<code class="literal">INTEGER</code>
									. Connector/J however returns
									<code class="literal">SMALLINT</code>
									. (Bug #44865)
								</p></li>
							<li class="listitem"><p>
									The result set returned by
									<code class="literal">getVersionColumns()</code>
									did not have the format defined in the JDBC API specifications.
									The third column,
									<code class="literal">DATA_TYPE</code>
									, of the result set should be of type
									<code class="literal">INTEGER</code>
									. Connector/J however returns
									<code class="literal">SMALLINT</code>
									. (Bug #44863)
								</p></li>
							<li class="listitem"><p>
									The result set returned by
									<code class="literal">getBestRowIdentifier()</code>
									did not have the format defined in the JDBC API specifications.
									The third column,
									<code class="literal">DATA_TYPE</code>
									, of the result set should be of type
									<code class="literal">INTEGER</code>
									. Connector/J however returns
									<code class="literal">SMALLINT</code>
									. (Bug #44862)
								</p></li>
							<li class="listitem"><p>
									Connector/J contains logic to generate a message text
									specifically for streaming result sets when there are
									<code class="literal">CommunicationsException</code>
									exceptions generated. However, this code was never reached.
								</p>
								<p>
									In the
									<code class="literal">CommunicationsException</code>
									code:
								</p>
								<pre class="programlisting">private boolean streamingResultSetInPlay = false;

public CommunicationsException(ConnectionImpl conn, long lastPacketSentTimeMs,
long lastPacketReceivedTimeMs, Exception underlyingException) {

this.exceptionMessage = SQLError.createLinkFailureMessageBasedOnHeuristics(conn,
      lastPacketSentTimeMs, lastPacketReceivedTimeMs, underlyingException,
      this.streamingResultSetInPlay);</pre>
								<p>
									<code class="literal">streamingResultSetInPlay</code>
									was always false, which in the following code in
									<code class="literal">SQLError.createLinkFailureMessageBasedOnHeuristics()</code>
									never being executed:
								</p>
								<pre class="programlisting">if (streamingResultSetInPlay) {
    exceptionMessageBuf.append(
    Messages.getString("CommunicationsException.ClientWasStreaming")); //$NON-NLS-1$
} else {
...</pre>
								<p>(Bug #44588)</p></li>
							<li class="listitem"><p>SQL injection was possible when
									using a string containing U+00A5 in a client-side prepared
									statement, and the character set being used was
									SJIS/Windows-31J. (Bug #41730)</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.getGeneratedKeys()</code>
									retained result set instances until the statement was closed.
									This caused memory leaks for long-lived statements, or
									statements used in tight loops. (Bug #44056)
								</p></li>
							<li class="listitem"><p>
									MySQL Connector/J 5.1.7 was slower than previous versions when
									the
									<code class="literal">rewriteBatchedStatements</code>
									option was set to
									<code class="literal">true</code>
									.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										The performance regression in
										<code class="literal">indexOfIgnoreCaseRespectMarker()</code>
										has been fixed. It has also been made possible for the driver
										to rewrite
										<code class="literal">INSERT</code>
										statements with
										<code class="literal">ON DUPLICATE KEY UPDATE</code>
										clauses in them, as long as the
										<code class="literal">UPDATE</code>
										clause contains no reference to
										<code class="literal">LAST_INSERT_ID()</code>
										, as that would cause the driver to return bogus values for
										<code class="literal">getGeneratedKeys()</code>
										invocations. This has resulted in improved performance over
										version 5.1.7.
									</p>
								</div>
								<p>(Bug #41532)</p></li>
							<li class="listitem"><p>
									<code class="literal">LoadBalancingConnectionProxy.doPing()</code>
									did not have blacklist awareness.
								</p>
								<p>
									<code class="literal">LoadBalancingConnectionProxy</code>
									implemented
									<code class="literal">doPing()</code>
									to ping all underlying connections, but it threw any exceptions
									it encountered during this process.
								</p>
								<p>With the global blacklist enabled, it catches these
									exceptions, adds the host to the global blacklist, and only
									throws an exception if all hosts are down. (Bug #43421)</p></li>
							<li class="listitem"><p>
									When connecting with
									<code class="literal">traceProtocol=true</code>
									, no trace data was generated for the server greeting or login
									request. (Bug #43070)
								</p></li>
							<li class="listitem"><p>When the MySQL Server was
									upgraded from 4.0 to 5.0, the Connector/J application then
									failed to connect to the server. This was because
									authentication failed when the application ran from EBCDIC
									platforms such as z/OS. (Bug #43071)</p></li>
							<li class="listitem"><p>
									A
									<code class="literal">ConcurrentModificationException</code>
									was generated in
									<code class="literal">LoadBalancingConnectionProxy</code>
									:
								</p>
								<pre class="programlisting">java.util.ConcurrentModificationException
 at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
 at java.util.HashMap$KeyIterator.next(Unknown Source)
 at
com.mysql.jdbc.LoadBalancingConnectionProxy.getGlobalBlacklist(LoadBalancingConnectionProxy.java:520)
 at com.mysql.jdbc.RandomBalanceStrategy.pickConnection(RandomBalanceStrategy.java:55)
 at
com.mysql.jdbc.LoadBalancingConnectionProxy.pickNewConnection(LoadBalancingConnectionProxy.java:414)
 at
com.mysql.jdbc.LoadBalancingConnectionProxy.invoke(LoadBalancingConnectionProxy.java:390)</pre>
								<p>(Bug #42055)</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.addBatch()</code>
									did not check for all parameters being set, which led to
									inconsistent behavior in
									<code class="literal">executeBatch()</code>
									, especially when rewriting batched statements into multi-value
									<code class="literal">INSERT</code>
									s. (Bug #41161)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-7"></a>A.1.16. Changes in MySQL
									Connector/J 5.1.7 (2008-10-21)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When statements include
									<code class="literal">ON DUPLICATE UPDATE</code>
									, and
									<code class="literal">rewriteBatchedStatements</code>
									is set to true, batched statements are not rewritten into the
									form
									<code class="literal">INSERT INTO table VALUES (), (),
										()</code>
									, instead the statements are executed sequentially.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When using
									<code class="literal">trustCertificateKeyStoreUrl</code>
									or
									<code class="literal">clientCertificateKeyStoreUrl</code>
									, an
									<code class="literal">IllegalStateException</code>
									was caused by an uninitialized
									<code class="literal">TrustManagerFactoryImpl</code>
									object. (Bug #11748637, Bug #36948, Bug #38192)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.getGeneratedKeys()</code>
									returned two keys when using
									<code class="literal">ON DUPLICATE KEY UPDATE</code>
									and the row was updated, not inserted. (Bug #42309)
								</p></li>
							<li class="listitem"><p>When configuring the Java
									Replication Driver the last slave specified was never used.
									(Bug #39611)</p></li>
							<li class="listitem"><p>
									When using the replication driver with
									<code class="literal">autoReconnect=true</code>
									, Connector/J checks in
									<code class="literal">PreparedStatement.execute</code>
									(also called by
									<code class="literal">CallableStatement.execute</code>
									) to determine if the first character of the statement is an <span
										class="quote">“<span class="quote">S</span>”
									</span>, in an attempt to block all statements that are not
									read-only-safe, for example non-<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a>
									statements. However, this also blocked <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/call.html"
										target="_top"><code class="literal">CALL</code></a>s to stored
									procedures, even if the stored procedures were defined as
									<code class="literal">SQL READ DATA</code>
									or
									<code class="literal">NO SQL</code>
									. (Bug #40031)
								</p></li>
							<li class="listitem"><p>
									When the
									<code class="literal">LoadBalancingConnectionProxy</code>
									handles a
									<code class="literal">SQLException</code>
									with SQL state starting with <span class="quote">“<span
										class="quote">08</span>”
									</span>, it calls
									<code class="literal">invalidateCurrentConnection</code>
									, which in turn removes that
									<code class="literal">Connection</code>
									from
									<code class="literal">liveConnections</code>
									and the
									<code class="literal">connectionsToHostsMap</code>
									, but it did not add the host to the new global blacklist, if
									the global blacklist was enabled.
								</p>
								<p>
									There was also the possibility of a
									<code class="literal">NullPointerException</code>
									when trying to update stats, where
									<code class="literal">connectionsToHostsMap.get(this.currentConn)</code>
									was called:
								</p>
								<pre class="programlisting">int hostIndex = ((Integer) this.hostsToListIndexMap.get(this.connectionsToHostsMap.get(this.currentConn))).intValue();</pre>
								<p>
									This could happen if a client tried to issue a rollback after
									catching a
									<code class="literal">SQLException</code>
									caused by a connection failure. (Bug #39784)
								</p></li>
							<li class="listitem"><p>
									When using the random load balancing strategy and starting with
									two servers that were both unavailable, an
									<code class="literal">IndexOutOfBoundsException</code>
									was generated when removing a server from the
									<code class="literal">whiteList</code>
									. (Bug #38782)
								</p></li>
							<li class="listitem"><p>
									With large result sets
									<code class="literal">ResultSet.findColumn</code>
									became a performance bottleneck. (Bug #39962)
								</p></li>
							<li class="listitem"><p>
									Connector/J ignored the value of the MySQL Server variable <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/replication-options-master.html#sysvar_auto_increment_increment"
										target="_top"><code class="literal">auto_increment_increment</code></a>.
									(Bug #39956)
								</p></li>
							<li class="listitem"><p>
									When an
									<code class="literal">INSERT ON DUPLICATE KEY UPDATE</code>
									was performed, and the key already existed, the
									<code class="literal">affected-rows</code>
									value was returned as 1 instead of 0. (Bug #39352)
								</p></li>
							<li class="listitem"><p>
									Connector/J failed to parse <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a>
									strings for nanos correctly. (Bug #39911)
								</p></li>
							<li class="listitem"><p>Connector/J threw the following
									exception when using a read-only connection:</p>
								<pre class="programlisting">java.sql.SQLException: Connection is read-only. Queries leading to data
modification are not allowed.</pre>
								<p>(Bug #38747)</p></li>
							<li class="listitem"><p>
									Connector/J was unable to connect when using a non-
									<code class="literal">latin1</code>
									password. (Bug #37570)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">useOldAliasMetadataBehavior</code>
									connection property was ignored. (Bug #35753)
								</p></li>
							<li class="listitem"><p>
									When
									<code class="literal">getGeneratedKeys()</code>
									was called on a statement that had not been created with
									<code class="literal">RETURN_GENERATED_KEYS</code>
									, no exception was thrown, and batched executions then returned
									erroneous values. (Bug #34185)
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">loadBalance</code>
									<code class="literal">bestResponseTime</code>
									blacklists did not have a global state. (Bug #33861)
								</p></li>
							<li class="listitem"><p>
									Incorrect result is returned from
									<code class="literal">isAfterLast()</code>
									in streaming
									<code class="literal">ResultSet</code>
									when using
									<code class="literal">setFetchSize(Integer.MIN_VALUE)</code>
									. (Bug #35170)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-6"></a>A.1.17. Changes in MySQL
									Connector/J 5.1.6 (2008-03-07)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Multiple result sets were not supported when using streaming
									mode to return data. Both normal statements and the result sets
									from stored procedures now return multiple results sets, with
									the exception of result sets using registered
									<code class="literal">OUTPUT</code>
									parameters. (Bug #33678)
								</p></li>
							<li class="listitem"><p>
									Add the
									<code class="literal">verifyServerCertificate</code>
									property. If set to "false" the driver will not verify the
									server's certificate when
									<code class="literal">useSSL</code>
									is set to "true"
								</p>
								<p>
									When using this feature, the keystore parameters should be
									specified by the
									<code class="literal">clientCertificateKeyStore*</code>
									properties, rather than system properties, as the JSSE doesn't
									it straightforward to have a nonverifying trust store and the
									"default" key store.
								</p></li>
							<li class="listitem"><p>
									The profiler event handling has been made extensible using the
									<code class="option">profilerEventHandler</code>
									connection property.
								</p></li>
							<li class="listitem"><p>XAConnections and datasources
									have been updated to the JDBC-4.0 standard.</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Prepared statements from pooled connections caused a
									<code class="classname">NullPointerException</code>
									when
									<code class="methodname">closed()</code>
									under JDBC-4.0. (Bug #35489)
								</p></li>
							<li class="listitem"><p>
									When
									<code class="literal">useServerPrepStmts=true</code>
									and slow query logging is enabled, the connector throws a
									<code class="classname">NullPointerException</code>
									when it encounters a slow query. (Bug #35666)
								</p></li>
							<li class="listitem"><p>
									The JDBC driver uses a different method for evaluating column
									names in
									<code class="methodname">resultsetmetadata.getColumnName()</code>
									and when looking for a column in
									<code class="methodname">resultset.getObject(columnName)</code>
									. This causes Hibernate to fail in queries where the two
									methods yield different results, for example in queries that
									use alias names:
								</p>
								<pre class="programlisting">SELECT column AS aliasName from table</pre>
								<p>(Bug #35150)</p></li>
							<li class="listitem"><p>
									<code class="methodname">DatabaseMetaData.getColumns()</code>
									returns incorrect
									<code class="literal">COLUMN_SIZE</code>
									value for
									<code class="literal">SET</code>
									column. (Bug #36830)
								</p></li>
							<li class="listitem"><p>
									When trying to read
									<code class="classname">Time</code>
									values like <span class="quote">“<span class="quote">00:00:00</span>”
									</span> with
									<code class="methodname">ResultSet.getTime(int)</code>
									an exception is thrown. (Bug #36051)
								</p></li>
							<li class="listitem"><p>
									When using the keyword <span class="quote">“<span
										class="quote">loadbalance</span>”
									</span> in the connection string and trying to perform load balancing
									between two databases, the driver appears to hang. (Bug #35660)
								</p></li>
							<li class="listitem"><p>JDBC data type getter method was
									changed to accept only column name, whereas previously it
									accepted column label. (Bug #35610)</p></li>
							<li class="listitem"><p>
									In calling a stored function returning a
									<code class="literal">bigint</code>
									, an exception is encountered beginning:
								</p>
								<pre class="programlisting">java.sql.SQLException: java.lang.NumberFormatException: For input string:</pre>
								<p>followed by the text of the stored function starting
									after the argument list. (Bug #35199)</p></li>
							<li class="listitem"><p>
									JDBC connection URL parameters is ignored when using
									<code class="literal">MysqlConnectionPoolDataSource</code>
									. (Bug #35810)
								</p></li>
							<li class="listitem"><p>Retrieving the server version
									information for an active connection could return invalid
									information if the default character encoding on the host was
									not ASCII compatible. (Bug #31192)</p></li>
							<li class="listitem"><p>
									<code class="literal">MysqlConnectionPoolDataSource</code>
									does not support
									<code class="literal">ReplicationConnection</code>
									. Notice that we implemented
									<code class="literal">com.mysql.jdbc.Connection</code>
									for
									<code class="literal">ReplicationConnection</code>
									, however, only accessors from ConnectionProperties are
									implemented (not the mutators), and they return values from the
									currently active connection. All other methods from
									<code class="literal">com.mysql.jdbc.Connection</code>
									are implemented, and operate on the currently active
									connection, with the exception of
									<code class="literal">resetServerState()</code>
									and
									<code class="literal">changeUser()</code>
									. (Bug #34937)
								</p></li>
							<li class="listitem"><p>
									When calling
									<code class="literal">isValid()</code>
									on an active connection, if the timeout is nonzero then the
									<code class="literal">Connection</code>
									is invalidated even if the
									<code class="literal">Connection</code>
									is valid. (Bug #34703)
								</p></li>
							<li class="listitem"><p>
									When retrieving the column type name of a geometry field, the
									driver would return
									<code class="literal">UNKNOWN</code>
									instead of
									<code class="literal">GEOMETRY</code>
									. (Bug #34194)
								</p></li>
							<li class="listitem"><p>
									The internal class
									<code class="classname">ResultSetInternalMethods</code>
									referenced the nonpublic class
									<code class="classname">com.mysql.jdbc.CachedResultSetMetaData</code>
									. (Bug #33823)
								</p></li>
							<li class="listitem"><p>
									<code class="methodname">ResultSet.getTimestamp()</code>
									would throw a
									<code class="literal">NullPointerException</code>
									instead of a
									<code class="literal">SQLException</code>
									when called on an empty
									<code class="literal">ResultSet</code>
									. (Bug #33162)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getTimestamp()</code>
									returns incorrect values for month/day of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a>s when
									using server-side prepared statements (not enabled by default).
									(Bug #34913)
								</p></li>
							<li class="listitem"><p>
									<code class="classname">RowDataStatic</code>
									doesn't always set the metadata in
									<code class="classname">ResultSetRow</code>
									, which can lead to failures when unpacking <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATE</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/time.html"
										target="_top"><code class="literal">TIME</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATETIME</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a> types
									when using absolute, relative, and previous result set
									navigation methods. (Bug #34762)
								</p></li>
							<li class="listitem"><p>
									It was not possible to truncate a <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> using
									<code class="literal">Blog.truncate()</code>
									when using 0 as an argument. (Bug #34677)
								</p></li>
							<li class="listitem"><p>
									Statements with batched values do not return correct values for
									<code class="literal">getGeneratedKeys()</code>
									when
									<code class="option">rewriteBatchedStatements</code>
									is set to
									<code class="literal">true</code>
									, and the statement has an
									<code class="literal">ON DUPLICATE KEY UPDATE</code>
									clause. (Bug #34093)
								</p></li>
							<li class="listitem"><p>
									A
									<code class="literal">NullPointerException</code>
									could be raised when using client-side prepared statements and
									enabled the prepared statement cache using the
									<code class="option">cachePrepStmts</code>
									. (Bug #33734)
								</p></li>
							<li class="listitem"><p>When using a cursor fetch for a
									statement, the internal prepared statement could cause a memory
									leak until the connection was closed. The internal prepared
									statement is now deleted when the corresponding result set is
									closed. (Bug #34518)</p></li>
							<li class="listitem"><p>Using server side cursors and
									cursor fetch, the table metadata information would return the
									data type name instead of the column name. (Bug #33594)</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet</code>
									returned by
									<code class="literal">Statement.getGeneratedKeys()</code>
									is not closed automatically when statement that created it is
									closed. (Bug #30508)
								</p></li>
							<li class="listitem"><p>Load balancing connection using
									best response time would incorrectly "stick" to hosts that were
									down when the connection was first created.</p>
								<p>
									We solve this problem with a black list that is used during the
									picking of new hosts. If the black list ends up including all
									configured hosts, the driver will retry for a configurable
									number of times (the
									<code class="option">retriesAllDown</code>
									configuration property, with a default of 120 times), sleeping
									250ms between attempts to pick a new connection.
								</p>
								<p>
									We've also went ahead and made the balancing strategy
									extensible. To create a new strategy, implement the interface
									<code class="classname">com.mysql.jdbc.BalanceStrategy</code>
									(which also includes our standard "extension" interface), and
									tell the driver to use it by passing in the class name using
									the
									<code class="option">loadBalanceStrategy</code>
									configuration property. (Bug #32877)
								</p></li>
							<li class="listitem"><p>
									Using
									<code class="function">CallableStatement.setNull()</code>
									on a stored function would throw an
									<code class="literal">ArrayIndexOutOfBounds</code>
									exception when setting the last parameter to null. (Bug #31823)
								</p></li>
							<li class="listitem"><p>
									When using a connection from
									<code class="classname">ConnectionPoolDataSource</code>
									, some
									<code class="function">Connection.prepareStatement()</code>
									methods would return null instead of the prepared statement.
									(Bug #32101)
								</p></li>
							<li class="listitem"><p>
									<code class="classname">MysqlValidConnectionChecker</code>
									doesn't properly handle connections created using
									<code class="classname">ReplicationConnection</code>
									. (Bug #31790)
								</p></li>
							<li class="listitem"><p>During a Daylight Savings Time
									(DST) switchover, there was no way to store two
									timestamp/datetime values , as the hours end up being the same
									when sent as the literal that MySQL requires.</p>
								<p>
									Note that to get this scenario to work with MySQL (since it
									doesn't support per-value timezones), you need to configure
									your server (or session) to be in UTC, and tell the driver not
									to use the legacy date/time code by setting
									<code class="literal">useLegacyDatetimeCode</code>
									to "false". This will cause the driver to always convert
									to/from the server and client timezone consistently.
								</p>
								<p>
									This bug fix also fixes Bug #15604, by adding entirely new
									date/time handling code that can be switched on by
									<code class="option">useLegacyDatetimeCode</code>
									being set to "false" as a JDBC configuration property. For
									Connector/J 5.1.x, the default is "true", in trunk and beyond
									it will be "false" (that is, the old date/time handling code
									will be deprecated) (Bug #32577, Bug #15604)
								</p></li>
							<li class="listitem"><p>When unpacking rows directly, we
									don't hand off error message packets to the internal method
									which decodes them correctly, so no exception is raised, and
									the driver than hangs trying to read rows that aren't there.
									This tends to happen when calling stored procedures, as normal
									SELECTs won't have an error in this spot in the protocol unless
									an I/O error occurs. (Bug #32246)</p></li>
							<li class="listitem"><p>Further fixes have been made to
									this bug in the event that a node is nonresponsive. Connector/J
									will now try a different random node instead of waiting for the
									node to recover before continuing. (Bug #31053)</p></li>
							<li class="listitem"><p>
									<code class="function">DatabaseMetadata.getColumns()</code>
									doesn't return the correct column names if the connection
									character isn't UTF-8. A bug in MySQL server compounded the
									issue, but was fixed within the MySQL 5.0 release cycle. The
									fix includes changes to all the sections of the code that
									access the server metadata. (Bug #20491)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="methodname">ResultSetMetadata.getColumnName()</code>
									for result sets returned from
									<code class="methodname">Statement.getGeneratedKeys()</code>
									- it was returning null instead of "GENERATED_KEY" as in 5.0.x.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-5"></a>A.1.18. Changes in MySQL
									Connector/J 5.1.5 (2007-10-09)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>New Features, Compared
								to the 5.0 Series of Connector/J</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>JDBC-4.0 standardized unwrapping
									to interfaces that include vendor extensions.</p></li>
							<li class="listitem"><p>Support for JDBC-4.0 XML
									processing using JAXP interfaces to DOM, SAX and StAX.</p></li>
							<li class="listitem"><p>
									JDBC-4.0 support for setting per-connection client information
									(which can be viewed in the comments section of a query using <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-processlist.html"
										target="_top"><code class="literal">SHOW
											PROCESSLIST</code></a> on a MySQL server, or can be extended to support
									custom persistence of the information using a public
									interface).
								</p></li>
							<li class="listitem"><p>
									Support for JDBC-4.0 <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NCHAR</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NVARCHAR</code></a> and
									<code class="literal">NCLOB</code>
									types.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added
									<code class="literal">autoSlowLog</code>
									configuration property, overrides
									<code class="literal">slowQueryThreshold*</code>
									properties, driver determines slow queries by those that are
									slower than 5 * stddev of the mean query time (outside the 96%
									percentile).
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>When a connection is in
									read-only mode, queries that are wrapped in parentheses were
									incorrectly identified DML statements. (Bug #28256)</p></li>
							<li class="listitem"><p>
									When calling
									<code class="literal">setTimestamp</code>
									on a prepared statement, the timezone information stored in the
									calendar object was ignored. This resulted in the incorrect
									<code class="literal">DATETIME</code>
									information being stored. The following example illustrates
									this:
								</p>
								<pre class="programlisting">Timestamp t = new Timestamp( cal.getTimeInMillis() );
ps.setTimestamp( N, t, cal );</pre>
								<p>(Bug #15604)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-4"></a>A.1.19. Changes in MySQL
									Connector/J 5.1.4 (Not Released)
								</h3>
							</div>
						</div>
					</div>
					<p>Only released internally.</p>
					<p>Version 5.1.4 has no changelog entries.</p>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-3"></a>A.1.20. Changes in MySQL
									Connector/J 5.1.3 (2007-09-10)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>New Features, Compared
								to the 5.0 Series of Connector/J</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>JDBC-4.0 standardized unwrapping
									to interfaces that include vendor extensions.</p></li>
							<li class="listitem"><p>Support for JDBC-4.0 XML
									processing using JAXP interfaces to DOM, SAX and StAX.</p></li>
							<li class="listitem"><p>
									JDBC-4.0 support for setting per-connection client information
									(which can be viewed in the comments section of a query using <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-processlist.html"
										target="_top"><code class="literal">SHOW
											PROCESSLIST</code></a> on a MySQL server, or can be extended to support
									custom persistence of the information using a public
									interface).
								</p></li>
							<li class="listitem"><p>
									Support for JDBC-4.0 <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NCHAR</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NVARCHAR</code></a> and
									<code class="literal">NCLOB</code>
									types.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Connector/J now connects using an initial character set of
									<code class="literal">utf-8</code>
									solely for the purpose of authentication to permit user names
									or database names in any character set to be used in the JDBC
									connection URL. (Bug #29853)
								</p></li>
							<li class="listitem"><p>
									Setting
									<code class="option">useBlobToStoreUTF8OutsideBMP</code>
									to
									<code class="literal">true</code>
									tells the driver to treat
									<code class="literal">[MEDIUM/LONG]BLOB</code>
									columns as
									<code class="literal">[LONG]VARCHAR</code>
									columns holding text encoded in UTF-8 that has characters
									outside the BMP (4-byte encodings), which MySQL server can't
									handle natively.
								</p>
								<p>
									Set
									<code class="option">utf8OutsideBmpExcludedColumnNamePattern</code>
									to a regex so that column names matching the given regex will
									still be treated as
									<code class="literal">BLOBs</code>
									The regex must follow the patterns used for the
									<code class="literal">java.util.regex</code>
									package. The default is to exclude no columns, and include all
									columns.
								</p>
								<p>
									Set
									<code class="option">utf8OutsideBmpIncludedColumnNamePattern</code>
									to specify exclusion rules to
									utf8OutsideBmpExcludedColumnNamePattern". The regex must follow
									the patterns used for the
									<code class="literal">java.util.regex</code>
									package.
								</p></li>
							<li class="listitem"><p>
									New methods on com.mysql.jdbc.Statement:
									<code class="literal">setLocalInfileInputStream()</code>
									and
									<code class="literal">getLocalInfileInputStream()</code>
									:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">setLocalInfileInputStream()</code>
												sets an
												<code class="literal">InputStream</code>
												instance that will be used to send data to the MySQL server
												for a <a class="ulink"
													href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
													target="_top"><code class="literal">LOAD DATA
														LOCAL INFILE</code></a> statement rather than a
												<code class="literal">FileInputStream</code>
												or
												<code class="literal">URLInputStream</code>
												that represents the path given as an argument to the
												statement.
											</p>
											<p>
												This stream will be read to completion upon execution of a <a
													class="ulink"
													href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
													target="_top"><code class="literal">LOAD DATA
														LOCAL INFILE</code></a> statement, and will automatically be closed
												by the driver, so it needs to be reset before each call to
												<code class="literal">execute*()</code>
												that would cause the MySQL server to request data to fulfill
												the request for <a class="ulink"
													href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
													target="_top"><code class="literal">LOAD DATA
														LOCAL INFILE</code></a>.
											</p>
											<p>
												If this value is set to
												<code class="literal">NULL</code>
												, the driver will revert to using a
												<code class="literal">FileInputStream</code>
												or
												<code class="literal">URLInputStream</code>
												as required.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getLocalInfileInputStream()</code>
												returns the
												<code class="literal">InputStream</code>
												instance that will be used to send data in response to a <a
													class="ulink"
													href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
													target="_top"><code class="literal">LOAD DATA
														LOCAL INFILE</code></a> statement.
											</p>
											<p>
												This method returns
												<code class="literal">NULL</code>
												if no such stream has been set using
												<code class="literal">setLocalInfileInputStream()</code>
												.
											</p></li>
									</ul>
								</div></li>
							<li class="listitem"><p>
									Errors encountered during
									<code class="literal">Statement</code>
									/
									<code class="literal">PreparedStatement</code>
									/
									<code class="literal">CallableStatement.executeBatch()</code>
									when
									<code class="literal">rewriteBatchStatements</code>
									has been set to
									<code class="literal">true</code>
									now return
									<code class="literal">BatchUpdateExceptions</code>
									according to the setting of
									<code class="literal">continueBatchOnError</code>
									.
								</p>
								<p>
									If
									<code class="literal">continueBatchOnError</code>
									is set to
									<code class="literal">true</code>
									, the update counts for the "chunk" that were sent as one unit
									will all be set to
									<code class="literal">EXECUTE_FAILED</code>
									, but the driver will attempt to process the remainder of the
									batch. You can determine which "chunk" failed by looking at the
									update counts returned in the
									<code class="literal">BatchUpdateException</code>
									.
								</p>
								<p>
									If
									<code class="literal">continueBatchOnError</code>
									is set to "false", the update counts returned will contain all
									updates up-to and including the failed "chunk", with all counts
									for the failed "chunk" set to
									<code class="literal">EXECUTE_FAILED</code>
									.
								</p>
								<p>
									Since MySQL doesn't return multiple error codes for
									multiple-statements, or for multi-value <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
										target="_top"><code class="literal">INSERT</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/replace.html"
										target="_top"><code class="literal">REPLACE</code></a>, it is
									the application's responsibility to handle determining which
									item(s) in the "chunk" actually failed.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.setQueryTimeout()</code>
									s now affect the entire batch for batched statements, rather
									than the individual statements that make up the batch.
								</p></li>
							<li class="listitem"><p>
									JDBC-4.0 ease-of-development features including
									auto-registration with the
									<code class="literal">DriverManager</code>
									through the service provider mechanism, standardized Connection
									validity checks and categorized
									<code class="literal">SQLExceptions</code>
									based on recoverability/retry-ability and class of the
									underlying error.
								</p></li>
							<li class="listitem"><p>
									The driver will automatically adjust the server session
									variable <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_net_write_timeout"
										target="_top"><code class="literal">net_write_timeout</code></a>
									when it determines its been asked for a "streaming" result, and
									resets it to the previous value when the result set has been
									consumed. (The configuration property is named
									<code class="option">netTimeoutForStreamingResults</code>
									, with a unit of seconds, the value '0' means the driver will
									not try and adjust this value).
								</p></li>
							<li class="listitem"><p>
									Added experimental support for statement "interceptors" through
									the
									<code class="literal">com.mysql.jdbc.StatementInterceptor</code>
									interface, examples are in
									<code class="filename">com/mysql/jdbc/interceptors</code>
									. Implement this interface to be placed "in between" query
									execution, so that it can be influenced (currently
									experimental).
								</p></li>
							<li class="listitem"><p>
									The data (and how it is stored) for
									<code class="literal">ResultSet</code>
									rows are now behind an interface which enables us (in some
									cases) to allocate less memory per row, in that for "streaming"
									result sets, we re-use the packet used to read rows, since only
									one row at a time is ever active.
								</p></li>
							<li class="listitem"><p>
									The driver now picks appropriate internal row representation
									(whole row in one buffer, or individual byte[]s for each column
									value) depending on heuristics, including whether or not the
									row has <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> or <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> types and
									the overall row-size. The threshold for row size that will
									cause the driver to use a buffer rather than individual byte[]s
									is configured by the configuration property
									<code class="option">largeRowSizeThreshold</code>
									, which has a default value of 2KB.
								</p></li>
							<li class="listitem"><p>
									Setting
									<code class="option">rewriteBatchedStatements</code>
									to
									<code class="literal">true</code>
									now causes CallableStatements with batched arguments to be
									re-written in the form "CALL (...); CALL (...); ..." to send
									the batch in as few client/server round trips as possible.
								</p></li>
							<li class="listitem"><p>Added two configuration
									parameters:</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">blobsAreStrings</code>
												: Should the driver always treat BLOBs as Strings. Added
												specifically to work around dubious metadata returned by the
												server for
												<code class="literal">GROUP BY</code>
												clauses. Defaults to false.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">functionsNeverReturnBlobs</code>
												: Should the driver always treat data from functions
												returning
												<code class="literal">BLOBs</code>
												as Strings. Added specifically to work around dubious
												metadata returned by the server for
												<code class="literal">GROUP BY</code>
												clauses. Defaults to false.
											</p></li>
									</ul>
								</div></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">CallableStatement.executeBatch()</code>
									doesn't work when connection property
									<code class="option">noAccessToProcedureBodies</code>
									has been set to
									<code class="literal">true</code>
									.
								</p>
								<p>
									The fix involves changing the behavior of
									<code class="option">noAccessToProcedureBodies</code>
									,in that the driver will now report all parameters as
									<code class="literal">IN</code>
									parameters but permit callers to call registerOutParameter() on
									them without throwing an exception. (Bug #28689)
								</p></li>
							<li class="listitem"><p>
									NPE with null column values when
									<code class="option">padCharsWithSpace</code>
									is set to true. (Bug #30851)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">setObject(int, Object, int, int)</code>
									delegate in PreparedStatementWrapper delegates to wrong method.
									(Bug #30892)
								</p></li>
							<li class="listitem"><p>
									Closing a load-balanced connection would cause a
									<code class="literal">ClassCastException</code>
									. (Bug #29852)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getTypeInfo()</code>
									for the types <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">NUMERIC</code></a> will
									return a precision of 254 for server versions older than 5.0.3,
									64 for versions 5.0.3 to 5.0.5 and 65 for versions newer than
									5.0.5. (Bug #28972)
								</p></li>
							<li class="listitem"><p>
									An
									<code class="literal">ArithmeticException</code>
									or
									<code class="literal">NullPointerException</code>
									would be raised when the batch had zero members and
									<code class="literal">rewriteBatchedStatements=true</code>
									when
									<code class="literal">addBatch()</code>
									was never called, or
									<code class="literal">executeBatch()</code>
									was called immediately after
									<code class="literal">clearBatch()</code>
									. (Bug #30550)
								</p></li>
							<li class="listitem"><p>
									Collation on <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a>
									column types would be misidentified. A fix has been added, but
									this fix only works for MySQL server versions 5.0.25 and newer,
									since earlier versions didn't consistently return correct
									metadata for functions, and thus results from subqueries and
									functions were indistinguishable from each other, leading to
									type-related bugs. (Bug #30664)
								</p></li>
							<li class="listitem"><p>Connection checker for JBoss
									didn't use same method parameters using reflection, causing
									connections to always seem "bad". (Bug #29106)</p></li>
							<li class="listitem"><p>
									Schema objects with identifiers other than the connection
									character aren't retrieved correctly in
									<code class="literal">ResultSetMetadata</code>
									. (Bug #27867)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.getServerCharacterEncoding()</code>
									doesn't work for servers with version &gt;= 4.1. (Bug #27182)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									doesn't contain
									<code class="literal">SCOPE_*</code>
									or
									<code class="literal">IS_AUTOINCREMENT</code>
									columns. (Bug #27915)
								</p></li>
							<li class="listitem"><p>
									The automated SVN revisions in
									<code class="literal">DBMD.getDriverVersion()</code>
									. The SVN revision of the directory is now inserted into the
									version information during the build. (Bug #21116)
								</p></li>
							<li class="listitem"><p>Specifying a "validation query"
									in your connection pool that starts with "/* ping */" _exactly_
									will cause the driver to instead send a ping to the server and
									return a fake result set (much lighter weight), and when using
									a ReplicationConnection or a LoadBalancedConnection, will send
									the ping across all active connections.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-2"></a>A.1.21. Changes in MySQL
									Connector/J 5.1.2 (2007-06-29)
								</h3>
							</div>
						</div>
					</div>
					<p class="release-level">This is a new Beta development
						release, fixing recently discovered bugs.</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Setting the configuration property
									<code class="literal">rewriteBatchedStatements</code>
									to
									<code class="literal">true</code>
									will now cause the driver to rewrite batched prepared
									statements with more than 3 parameter sets in a batch into
									multi-statements (separated by ";") if they are not plain (that
									is, without <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a> or
									<code class="literal">ON DUPLICATE KEY UPDATE</code>
									clauses) <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
										target="_top"><code class="literal">INSERT</code></a> or <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/replace.html"
										target="_top"><code class="literal">REPLACE</code></a>
									statements.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-1"></a>A.1.22. Changes in MySQL
									Connector/J 5.1.1 (2007-06-22)
								</h3>
							</div>
						</div>
					</div>
					<p class="release-level">This is a new Alpha development
						release, adding new features and fixing recently discovered bugs.
					</p>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<span class="bold"><strong>Incompatible Change</strong></span>:
									Pulled vendor-extension methods of
									<code class="literal">Connection</code>
									implementation out into an interface to support
									<code class="literal">java.sql.Wrapper</code>
									functionality from
									<code class="literal">ConnectionPoolDataSource</code>
									. The vendor extensions are javadoc'd in the
									<code class="literal">com.mysql.jdbc.Connection</code>
									interface.
								</p>
								<p>
									For those looking further into the driver implementation, it is
									not an API that is used for pluggability of implementations
									inside our driver (which is why there are still references to
									<code class="literal">ConnectionImpl</code>
									throughout the code).
								</p>
								<p>
									We've also added server and client
									<code class="literal">prepareStatement()</code>
									methods that cover all of the variants in the JDBC API.
								</p>
								<p>
									<code class="literal">Connection.serverPrepare(String)</code>
									has been re-named to
									<code class="literal">Connection.serverPrepareStatement()</code>
									for consistency with
									<code class="literal">Connection.clientPrepareStatement()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Setting
									<code class="literal">rewriteBatchedStatements</code>
									to
									<code class="literal">true</code>
									now causes
									<code class="literal">CallableStatements</code>
									with batched arguments to be re-written in the form
									<code class="literal">CALL (...); CALL (...); ...</code>
									to send the batch in as few client/server round trips as
									possible.
								</p></li>
							<li class="listitem"><p>
									See the sources (fully javadoc'd) for
									<code class="literal">com.mysql.jdbc.StatementInterceptor</code>
									for more details until we iron out the API and get it
									documented in the manual.
								</p></li>
							<li class="listitem"><p>
									Added experimental support for statement "interceptors" through
									the
									<code class="literal">com.mysql.jdbc.StatementInterceptor</code>
									interface, examples are in
									<code class="filename">com/mysql/jdbc/interceptors</code>
									.
								</p>
								<p>Implement this interface to be placed "in between" query
									execution, so that you can influence it. (currently
									experimental).</p>
								<p>
									<code class="literal">StatementInterceptors</code>
									are "chainable" when configured by the user, the results
									returned by the "current" interceptor will be passed on to the
									next on in the chain, from left-to-right order, as specified by
									the user in the JDBC configuration property
									<code class="literal">statementInterceptors</code>
									.
								</p></li>
							<li class="listitem"><p>
									Driver now picks appropriate internal row representation (whole
									row in one buffer, or individual byte[]s for each column value)
									depending on heuristics, including whether or not the row has <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> or <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> types and
									the overall row-size. The threshold for row size that will
									cause the driver to use a buffer rather than individual byte[]s
									is configured by the configuration property
									<code class="literal">largeRowSizeThreshold</code>
									, which has a default value of 2KB.
								</p></li>
							<li class="listitem"><p>
									Similar to
									<code class="literal">Connection</code>
									, we pulled out vendor extensions to
									<code class="literal">Statement</code>
									into an interface named
									<code class="literal">com.mysql.Statement</code>
									, and moved the
									<code class="literal">Statement</code>
									class into
									<code class="literal">com.mysql.StatementImpl</code>
									. The two methods (javadoc'd in
									<code class="literal">com.mysql.Statement</code>
									are
									<code class="literal">enableStreamingResults()</code>
									, which already existed, and
									<code class="literal">disableStreamingResults()</code>
									which sets the statement instance back to the fetch size and
									result set type it had before
									<code class="literal">enableStreamingResults()</code>
									was called.
								</p></li>
							<li class="listitem"><p>
									The data (and how it is stored) for
									<code class="literal">ResultSet</code>
									rows are now behind an interface which enables us (in some
									cases) to allocate less memory per row, in that for "streaming"
									result sets, we re-use the packet used to read rows, since only
									one row at a time is ever active.
								</p></li>
							<li class="listitem"><p>Externalized the descriptions of
									connection properties.</p></li>
							<li class="listitem"><p>
									Made it possible to retrieve prepared statement parameter
									bindings (to be used in
									<code class="literal">StatementInterceptors</code>
									, primarily).
								</p></li>
							<li class="listitem"><p>Row navigation now causes any
									streams/readers open on the result set to be closed, as in some
									cases we're reading directly from a shared network packet and
									it will be overwritten by the "next" row.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-1-0"></a>A.1.23. Changes in MySQL
									Connector/J 5.1.0 (2007-04-11)
								</h3>
							</div>
						</div>
					</div>
					<p>This is the first public alpha release of the current
						Connector/J 5.1 development branch, providing an insight to
						upcoming features. Although some of these are still under
						development, this release includes the following new features and
						changes (in comparison to the current Connector/J 5.0 production
						release):</p>
					<p>
						<span class="bold"><strong>Important change:</strong></span> Due
						to a number of issues with the use of server-side prepared
						statements, Connector/J 5.0.5 has disabled their use by default.
						The disabling of server-side prepared statements does not affect
						the operation of the connector in any way.
					</p>
					<p>To enable server-side prepared statements you must add the
						following configuration property to your connector string:</p>
					<pre class="programlisting">useServerPrepStmts=true</pre>
					<p>
						The default value of this property is
						<code class="literal">false</code>
						(that is, Connector/J does not use server-side prepared
						statements).
					</p>
					<div xmlns="http://www.w3.org/1999/xhtml" class="note"
						style="margin-left: 0.5in; margin-right: 0.5in;">
						<div class="admon-title">Note</div>
						<p xmlns="">
							The disabling of server-side prepared statements does not affect
							the operation of the connector. However, if you use the
							<code class="literal">useTimezone=true</code>
							connection option and use client-side prepared statements
							(instead of server-side prepared statements) you should also set
							<code class="literal">useSSPSCompatibleTimezoneShift=true</code>
							.
						</p>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added support for JDBC-4.0's
									<code class="literal">Wrapper</code>
									interface.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">com.mysql.jdbc.java6.rtjar</code>
									: Full path to your Java-6
									<code class="filename">rt.jar</code>
									file
								</p></li>
							<li class="listitem"><p>
									Added support for JDBC-4.0's client information. The backend
									storage of information provided using
									<code class="literal">Connection.setClientInfo()</code>
									and retrieved by
									<code class="literal">Connection.getClientInfo()</code>
									is pluggable by any class that implements the
									<code class="literal">com.mysql.jdbc.JDBC4ClientInfoProvider</code>
									interface and has a no-args constructor.
								</p>
								<p>
									The implementation used by the driver is configured using the
									<code class="literal">clientInfoProvider</code>
									configuration property (with a default of value of
									<code class="literal">com.mysql.jdbc.JDBC4CommentClientInfoProvider</code>
									, an implementation which lists the client information as a
									comment prepended to every query sent to the server).
								</p>
								<p>This functionality is only available when using Java-6 or
									newer.</p></li>
							<li class="listitem"><p>
									New feature—driver will automatically adjust session variable <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_net_write_timeout"
										target="_top"><code class="literal">net_write_timeout</code></a>
									when it determines it has been asked for a "streaming" result,
									and resets it to the previous value when the result set has
									been consumed. (configuration property is named
									<code class="literal">netTimeoutForStreamingResults</code>
									value and has a unit of seconds, the value
									<code class="literal">0</code>
									means the driver will not try and adjust this value).
								</p></li>
							<li class="listitem"><p>Re-worked Ant buildfile to build
									JDBC-4.0 classes separately, as well as support building under
									Eclipse (since Eclipse can't mix/match JDKs).</p>
								<p>
									To build, you must set
									<code class="literal">JAVA_HOME</code>
									to J2SDK-1.4.2 or Java-5, and set the following properties on
									your Ant command line:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">com.mysql.jdbc.java6.javac</code>
												: Full path to your Java-6 <span class="command"><strong>javac</strong></span>
												executable
											</p></li>
										<li class="listitem"><p>
												<code class="literal">com.mysql.jdbc.java6.rtjar</code>
												: Full path to your Java-6
												<code class="filename">rt.jar</code>
												file
											</p></li>
									</ul>
								</div></li>
							<li class="listitem"><p>Added support for JDBC-4.0's
									SQLXML interfaces.</p></li>
							<li class="listitem"><p>
									<code class="literal">com.mysql.jdbc.java6.javac</code>
									: Full path to your Java-6 <span class="command"><strong>javac</strong></span>
									executable
								</p></li>
							<li class="listitem"><p>
									Added support for JDBC-4.0's
									<code class="literal">NCLOB</code>
									, and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NCHAR</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">NVARCHAR</code></a> types.
								</p></li>
							<li class="listitem"><p>
									Added support for JDBC-4.0 categorized
									<code class="literal">SQLExceptions</code>
									.
								</p></li>
							<li class="listitem"><p>
									Refactored
									<code class="literal">CommunicationsException</code>
									into a JDBC-3.0 version, and a JDBC-4.0 version (which extends
									<code class="literal">SQLRecoverableException</code>
									, now that it exists).
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										This change means that if you were catching
										<code class="literal">com.mysql.jdbc.CommunicationsException</code>
										in your applications instead of looking at the SQLState class
										of
										<code class="literal">08</code>
										, and are moving to Java 6 (or newer), you need to change your
										imports to that exception to be
										<code class="literal">com.mysql.jdbc.exceptions.jdbc4.CommunicationsException</code>
										, as the old class will not be instantiated for communications
										link-related errors under Java 6.
									</p>
								</div></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-5-0-x"></a>A.2. Changes in MySQL Connector/J
								5.0.x
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-5-0-8">A.2.1.
									Changes in MySQL Connector/J 5.0.8 (2007-10-09)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-7">A.2.2.
									Changes in MySQL Connector/J 5.0.7 (2007-07-20)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-6">A.2.3.
									Changes in MySQL Connector/J 5.0.6 (2007-05-15)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-5">A.2.4.
									Changes in MySQL Connector/J 5.0.5 (2007-03-02)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-4">A.2.5.
									Changes in MySQL Connector/J 5.0.4 (2006-10-20)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-3">A.2.6.
									Changes in MySQL Connector/J 5.0.3 (2006-07-26, beta)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-2">A.2.7.
									Changes in MySQL Connector/J 5.0.2 (2006-07-11)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-1">A.2.8.
									Changes in MySQL Connector/J 5.0.1 (Not Released)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-5-0-0">A.2.9.
									Changes in MySQL Connector/J 5.0.0 (2005-12-22)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-8"></a>A.2.1. Changes in MySQL Connector/J
									5.0.8 (2007-10-09)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Driver will now fall back to sane defaults for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>
									and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_net_buffer_length"
										target="_top"><code class="literal">net_buffer_length</code></a>
									if the server reports them incorrectly (and will log this
									situation at
									<code class="literal">WARN</code>
									level, since it is actually an error condition).
								</p></li>
							<li class="listitem"><p>XAConnections now start in
									auto-commit mode (as per JDBC-4.0 specification clarification).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">functionsNeverReturnBlobs</code>
									: Should the driver always treat data from functions returning
									<code class="literal">BLOBs</code>
									as Strings. Added specifically to work around dubious metadata
									returned by the server for
									<code class="literal">GROUP BY</code>
									clauses. Defaults to false.
								</p></li>
							<li class="listitem"><p>Added two configuration
									parameters:</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">blobsAreStrings</code>
												: Should the driver always treat BLOBs as Strings. Added
												specifically to work around dubious metadata returned by the
												server for
												<code class="literal">GROUP BY</code>
												clauses. Defaults to false.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">functionsNeverReturnBlobs</code>
												: Should the driver always treat data from functions
												returning
												<code class="literal">BLOBs</code>
												as Strings. Added specifically to work around dubious
												metadata returned by the server for
												<code class="literal">GROUP BY</code>
												clauses. Defaults to false.
											</p></li>
									</ul>
								</div></li>
							<li class="listitem"><p>
									<code class="literal">blobsAreStrings</code>
									: Should the driver always treat BLOBs as Strings. Added
									specifically to work around dubious metadata returned by the
									server for
									<code class="literal">GROUP BY</code>
									clauses. Defaults to false.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Connections established using URLs of the form
									<code class="literal">jdbc:mysql:loadbalance://</code>
									weren't doing failover if they tried to connect to a MySQL
									server that was down. The driver now attempts connections to
									the next "best" (depending on the load balance strategy in use)
									server, and continues to attempt connecting to the next "best"
									server every 250 milliseconds until one is found that is up and
									running or 5 minutes has passed.
								</p>
								<p>
									If the driver gives up, it will throw the last-received
									<code class="literal">SQLException</code>
									. (Bug #31053)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">CallableStatement.executeBatch()</code>
									doesn't work when connection property
									<code class="option">noAccessToProcedureBodies</code>
									has been set to
									<code class="literal">true</code>
									.
								</p>
								<p>
									The fix involves changing the behavior of
									<code class="option">noAccessToProcedureBodies</code>
									,in that the driver will now report all parameters as
									<code class="literal">IN</code>
									parameters but permit callers to call registerOutParameter() on
									them without throwing an exception. (Bug #28689)
								</p></li>
							<li class="listitem"><p>
									NPE with null column values when
									<code class="option">padCharsWithSpace</code>
									is set to true. (Bug #30851)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">setObject(int, Object, int, int)</code>
									delegate in PreparedStatementWrapper delegates to wrong method.
									(Bug #30892)
								</p></li>
							<li class="listitem"><p>
									Closing a load-balanced connection would cause a
									<code class="literal">ClassCastException</code>
									. (Bug #29852)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getTypeInfo()</code>
									for the types <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">NUMERIC</code></a> will
									return a precision of 254 for server versions older than 5.0.3,
									64 for versions 5.0.3 to 5.0.5 and 65 for versions newer than
									5.0.5. (Bug #28972)
								</p></li>
							<li class="listitem"><p>
									An
									<code class="literal">ArithmeticException</code>
									or
									<code class="literal">NullPointerException</code>
									would be raised when the batch had zero members and
									<code class="literal">rewriteBatchedStatements=true</code>
									when
									<code class="literal">addBatch()</code>
									was never called, or
									<code class="literal">executeBatch()</code>
									was called immediately after
									<code class="literal">clearBatch()</code>
									. (Bug #30550)
								</p></li>
							<li class="listitem"><p>
									Collation on <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a>
									column types would be misidentified. A fix has been added, but
									this fix only works for MySQL server versions 5.0.25 and newer,
									since earlier versions didn't consistently return correct
									metadata for functions, and thus results from subqueries and
									functions were indistinguishable from each other, leading to
									type-related bugs. (Bug #30664)
								</p></li>
							<li class="listitem"><p>Connection checker for JBoss
									didn't use same method parameters using reflection, causing
									connections to always seem "bad". (Bug #29106)</p></li>
							<li class="listitem"><p>
									Cached metadata with
									<code class="literal">PreparedStatement.execute()</code>
									throws
									<code class="literal">NullPointerException</code>
									. (Bug #27412)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">UNSIGNED</code>
									types not reported using
									<code class="literal">DBMD.getTypeInfo()</code>
									, and capitalization of type names is not consistent between
									<code class="literal">DBMD.getColumns()</code>
									,
									<code class="literal">RSMD.getColumnTypeName()</code>
									and
									<code class="literal">DBMD.getTypeInfo()</code>
									.
								</p>
								<p>
									This fix also ensures that the precision of
									<code class="literal">UNSIGNED MEDIUMINT</code>
									and
									<code class="literal">UNSIGNED BIGINT</code>
									is reported correctly using
									<code class="literal">DBMD.getColumns()</code>
									. (Bug #27916)
								</p></li>
							<li class="listitem"><p>When a connection is in
									read-only mode, queries that are wrapped in parentheses were
									incorrectly identified DML statements. (Bug #28256)</p></li>
							<li class="listitem"><p>
									Schema objects with identifiers other than the connection
									character aren't retrieved correctly in
									<code class="literal">ResultSetMetadata</code>
									. (Bug #27867)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.getServerCharacterEncoding()</code>
									doesn't work for servers with version &gt;= 4.1. (Bug #27182)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									doesn't contain
									<code class="literal">SCOPE_*</code>
									or
									<code class="literal">IS_AUTOINCREMENT</code>
									columns. (Bug #27915)
								</p></li>
							<li class="listitem"><p>
									The automated SVN revisions in
									<code class="literal">DBMD.getDriverVersion()</code>
									. The SVN revision of the directory is now inserted into the
									version information during the build. (Bug #21116)
								</p></li>
							<li class="listitem"><p>Specifying a "validation query"
									in your connection pool that starts with "/* ping */" _exactly_
									will cause the driver to instead send a ping to the server and
									return a fake result set (much lighter weight), and when using
									a ReplicationConnection or a LoadBalancedConnection, will send
									the ping across all active connections.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-7"></a>A.2.2. Changes in MySQL Connector/J
									5.0.7 (2007-07-20)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">useNanosForElapsedTime</code>
									- for profiling/debugging functionality that measures elapsed
									time, should the driver try to use nanoseconds resolution if
									available (requires JDK &gt;= 1.5)?
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										If
										<code class="literal">useNanosForElapsedTime</code>
										is set to
										<code class="literal">true</code>
										, and this property is set to "0" (or left default), then
										elapsed times will still be measured in nanoseconds (if
										possible), but the slow query threshold will be converted from
										milliseconds to nanoseconds, and thus have an upper bound of
										approximately 2000 milliseconds (as that threshold is
										represented as an integer, not a long).
									</p>
								</div></li>
							<li class="listitem"><p>
									Added new debugging functionality - Setting configuration
									property
									<code class="literal">includeInnodbStatusInDeadlockExceptions</code>
									to
									<code class="literal">true</code>
									will cause the driver to append the output of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-engine.html"
										target="_top"><code class="literal">SHOW ENGINE
											INNODB STATUS</code></a> to deadlock-related exceptions, which will
									enumerate the current locks held inside InnoDB.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">tcpTrafficClass</code>
									- Should the driver set traffic class or type-of-service
									fields? See the documentation for
									java.net.Socket.setTrafficClass() for more information.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">tcpSndBuf</code>
									- Should the driver set SO_SND_BUF to the given value? The
									default value of '0', means use the platform default value for
									this property.
								</p></li>
							<li class="listitem"><p>
									Setting the configuration parameter
									<code class="literal">useCursorFetch</code>
									to
									<code class="literal">true</code>
									for MySQL-5.0+ enables the use of cursors that enable
									Connector/J to save memory by fetching result set rows in
									chunks (where the chunk size is set by calling setFetchSize()
									on a Statement or ResultSet) by using fully materialized
									cursors on the server.
								</p></li>
							<li class="listitem"><p>Added configuration properties
									to enable tuning of TCP/IP socket parameters:</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">tcpNoDelay</code>
												- Should the driver set SO_TCP_NODELAY (disabling the Nagle
												Algorithm, default
												<code class="literal">true</code>
												)?
											</p></li>
										<li class="listitem"><p>
												<code class="literal">tcpKeepAlive</code>
												- Should the driver set SO_KEEPALIVE (default
												<code class="literal">true</code>
												)?
											</p></li>
										<li class="listitem"><p>
												<code class="literal">tcpRcvBuf</code>
												- Should the driver set SO_RCV_BUF to the given value? The
												default value of '0', means use the platform default value
												for this property.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">tcpSndBuf</code>
												- Should the driver set SO_SND_BUF to the given value? The
												default value of '0', means use the platform default value
												for this property.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">tcpTrafficClass</code>
												- Should the driver set traffic class or type-of-service
												fields? See the documentation for
												java.net.Socket.setTrafficClass() for more information.
											</p></li>
									</ul>
								</div></li>
							<li class="listitem"><p>
									Setting
									<code class="literal">useDynamicCharsetInfo</code>
									to
									<code class="literal">false</code>
									now causes driver to use static lookups for collations as well
									(makes ResultSetMetadata.isCaseSensitive() much more efficient,
									which leads to performance increase for ColdFusion, which calls
									this method for every column on every table it sees, it
									appears).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">tcpRcvBuf</code>
									- Should the driver set SO_RCV_BUF to the given value? The
									default value of '0', means use the platform default value for
									this property.
								</p></li>
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">slowQueryThresholdNanos</code>
									- if
									<code class="literal">useNanosForElapsedTime</code>
									is set to
									<code class="literal">true</code>
									, and this property is set to a nonzero value the driver will
									use this threshold (in nanosecond units) to determine if a
									query was slow, instead of using millisecond units.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">tcpNoDelay</code>
									- Should the driver set SO_TCP_NODELAY (disabling the Nagle
									Algorithm, default
									<code class="literal">true</code>
									)?
								</p></li>
							<li class="listitem"><p>
									Driver detects when it is running in a ColdFusion MX server
									(tested with version 7), and uses the configuration bundle
									<code class="literal">coldFusion</code>
									, which sets
									<code class="literal">useDynamicCharsetInfo</code>
									to
									<code class="literal">false</code>
									(see previous entry), and sets
									<code class="literal">useLocalSessionState</code>
									and autoReconnect to
									<code class="literal">true</code>
									.
								</p></li>
							<li class="listitem"><p>Give more information in
									EOFExceptions thrown out of MysqlIO (how many bytes the driver
									expected to read, how many it actually read, say that
									communications with the server were unexpectedly lost).</p></li>
							<li class="listitem"><p>
									<code class="literal">tcpKeepAlive</code>
									- Should the driver set SO_KEEPALIVE (default
									<code class="literal">true</code>
									)?
								</p></li>
							<li class="listitem"><p>
									The driver will now automatically set
									<code class="literal">useServerPrepStmts</code>
									to
									<code class="literal">true</code>
									when
									<code class="literal">useCursorFetch</code>
									has been set to
									<code class="literal">true</code>
									, since the feature requires server-side prepared statements to
									function.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Parser in client-side prepared
									statements eats character following '/' if it is not a
									multi-line comment. (Bug #28851)</p></li>
							<li class="listitem"><p>Parser in client-side prepared
									statements runs to end of statement, rather than end-of-line
									for '#' comments. Also added support for '--' single-line
									comments. (Bug #28956)</p></li>
							<li class="listitem"><p>Don't send any file data in
									response to LOAD DATA LOCAL INFILE if the feature is disabled
									at the client side. This is to prevent a malicious server or
									man-in-the-middle from asking the client for data that the
									client is not expecting. Thanks to Jan Kneschke for discovering
									the exploit and Andrey "Poohie" Hristov, Konstantin Osipov and
									Sergei Golubchik for discussions about implications and
									possible fixes. (Bug #29605)</p></li>
							<li class="listitem"><p>PreparedStatement.getMetaData()
									for statements containing leading one-line comments is not
									returned correctly.</p>
								<p>
									As part of this fix, we also overhauled detection of DML for
									<code class="literal">executeQuery()</code>
									and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a>s for
									<code class="literal">executeUpdate()</code>
									in plain and prepared statements to be aware of the same types
									of comments. (Bug #28469)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-6"></a>A.2.3. Changes in MySQL Connector/J
									5.0.6 (2007-05-15)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>More intelligent initial packet
									sizes for the "shared" packets are used (512 bytes, rather than
									16K), and initial packets used during handshake are now sized
									appropriately as to not require reallocation.</p></li>
							<li class="listitem"><p>
									Driver will now use
									<code class="literal">INSERT INTO ... VALUES (DEFAULT)</code>
									form of statement for updatable result sets for
									<code class="literal">ResultSet.insertRow()</code>
									, rather than pre-populating the insert row with values from
									<code class="literal">DatabaseMetaData.getColumns()</code>
									(which results in a <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-columns.html"
										target="_top"><code class="literal">SHOW FULL
											COLUMNS</code></a> on the server for every result set). If an
									application requires access to the default values before
									<code class="literal">insertRow()</code>
									has been called, the JDBC URL should be configured with
									<code class="literal">populateInsertRowWithDefaultValues</code>
									set to
									<code class="literal">true</code>
									.
								</p>
								<p>This fix specifically targets performance issues with
									ColdFusion and the fact that it seems to ask for updatable
									result sets no matter what the application does with them.</p></li>
							<li class="listitem"><p>
									Fixed issue where a failed-over connection would let an
									application call
									<code class="literal">setReadOnly(false)</code>
									, when that call should be ignored until the connection is
									reconnected to a writable master unless
									<code class="literal">failoverReadOnly</code>
									had been set to
									<code class="literal">false</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">com.mysql.jdbc.[NonRegistering]Driver</code>
									now understands URLs of the format
									<code class="literal">jdbc:mysql:replication://</code>
									and
									<code class="literal">jdbc:mysql:loadbalance://</code>
									which will create a ReplicationConnection (exactly like when
									using
									<code class="literal">[NonRegistering]ReplicationDriver</code>
									) and an experimental load-balanced connection designed for use
									with SQL nodes in a MySQL Cluster/NDB environment,
									respectively.
								</p>
								<p>
									In an effort to simplify things, we're working on deprecating
									multiple drivers, and instead specifying different core
									behavior based upon JDBC URL prefixes, so watch for
									<code class="literal">[NonRegistering]ReplicationDriver</code>
									to eventually disappear, to be replaced with
									<code class="literal">com.mysql.jdbc[NonRegistering]Driver</code>
									with the new URL prefix.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">random</code>
									: The driver will pick a random host for each request. This
									tends to work better than round-robin, as the randomness will
									somewhat account for spreading loads where requests vary in
									response time, while round-robin can sometimes lead to
									overloaded nodes if there are variations in response times
									across the workload.
								</p></li>
							<li class="listitem"><p>
									Give better error message when "streaming" result sets, and the
									connection gets clobbered because of exceeding <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_net_write_timeout"
										target="_top"><code class="literal">net_write_timeout</code></a>
									on the server.
								</p></li>
							<li class="listitem"><p>
									New configuration property,
									<code class="literal">enableQueryTimeouts</code>
									(default
									<code class="literal">true</code>
									).
								</p>
								<p>
									When enabled, query timeouts set with
									<code class="literal">Statement.setQueryTimeout()</code>
									use a shared
									<code class="literal">java.util.Timer</code>
									instance for scheduling. Even if the timeout doesn't expire
									before the query is processed, there will be memory used by the
									<code class="literal">TimerTask</code>
									for the given timeout which won't be reclaimed until the time
									the timeout would have expired if it hadn't been cancelled by
									the driver. High-load environments might want to consider
									disabling this functionality. (this configuration property is
									part of the
									<code class="literal">maxPerformance</code>
									configuration bundle).
								</p></li>
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">useDynamicCharsetInfo</code>
									. If set to
									<code class="literal">false</code>
									(the default), the driver will use a per-connection cache of
									character set information queried from the server when
									necessary, or when set to
									<code class="literal">true</code>
									, use a built-in static mapping that is more efficient, but
									isn't aware of custom character sets or character sets
									implemented after the release of the JDBC driver.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										This only affects the
										<code class="literal">padCharsWithSpace</code>
										configuration property and the
										<code class="literal">ResultSetMetaData.getColumnDisplayWidth()</code>
										method.
									</p>
								</div></li>
							<li class="listitem"><p>
									When
									<code class="literal">useLocalSessionState</code>
									is set to
									<code class="literal">true</code>
									and connected to a MySQL-5.0 or later server, the JDBC driver
									will now determine whether an actual
									<code class="literal">commit</code>
									or
									<code class="literal">rollback</code>
									statement needs to be sent to the database when
									<code class="literal">Connection.commit()</code>
									or
									<code class="literal">Connection.rollback()</code>
									is called.
								</p>
								<p>
									This is especially helpful for high-load situations with
									connection pools that always call
									<code class="literal">Connection.rollback()</code>
									on connection check-in/check-out because it avoids a round-trip
									to the server.
								</p></li>
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">padCharsWithSpace</code>
									(defaults to
									<code class="literal">false</code>
									). If set to
									<code class="literal">true</code>
									, and a result set column has the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">CHAR</code></a> type and
									the value does not fill the amount of characters specified in
									the DDL for the column, the driver will pad the remaining
									characters with space (for ANSI compliance).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">bestResponseTime</code>
									: The driver will route the request to the host that had the
									best response time for the previous transaction.
								</p></li>
							<li class="listitem"><p>
									Added an experimental load-balanced connection designed for use
									with SQL nodes in a MySQL Cluster/NDB environment (This is not
									for master-slave replication. For that, we suggest you look at
									<code class="literal">ReplicationConnection</code>
									or
									<code class="literal">lbpool</code>
									).
								</p>
								<p>
									If the JDBC URL starts with
									<code class="literal">jdbc:mysql:loadbalance://host-1,host-2,...host-n</code>
									, the driver will create an implementation of
									<code class="literal">java.sql.Connection</code>
									that load balances requests across a series of MySQL JDBC
									connections to the given hosts, where the balancing takes place
									after transaction commit.
								</p>
								<p>Therefore, for this to work (at all), you must use
									transactions, even if only reading data.</p>
								<p>Physical connections to the given hosts will not be
									created until needed.</p>
								<p>The driver will invalidate connections that it detects
									have had communication errors when processing a request. A new
									connection to the problematic host will be attempted the next
									time it is selected by the load balancing algorithm.</p>
								<p>
									There are two choices for load balancing algorithms, which may
									be specified by the
									<code class="literal">loadBalanceStrategy</code>
									JDBC URL configuration property:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">random</code>
												: The driver will pick a random host for each request. This
												tends to work better than round-robin, as the randomness
												will somewhat account for spreading loads where requests
												vary in response time, while round-robin can sometimes lead
												to overloaded nodes if there are variations in response
												times across the workload.
											</p></li>
										<li class="listitem"><p>
												<code class="literal">bestResponseTime</code>
												: The driver will route the request to the host that had the
												best response time for the previous transaction.
											</p></li>
									</ul>
								</div></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When the configuration property
									<code class="literal">useCursorFetch</code>
									was set to
									<code class="literal">true</code>
									, sometimes server would return new, more exact metadata during
									the execution of the server-side prepared statement that
									enables this functionality, which the driver ignored (using the
									original metadata returned during
									<code class="literal">prepare()</code>
									), causing corrupt reading of data due to type mismatch when
									the actual rows were returned. (Bug #26173)
								</p></li>
							<li class="listitem"><p>
									Whitespace surrounding storage/size specifiers in stored
									procedure parameters declaration causes
									<code class="literal">NumberFormatException</code>
									to be thrown when calling stored procedure on JDK-1.5 or newer,
									as the Number classes in JDK-1.5+ are whitespace intolerant.
									(Bug #25624)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.getTransactionIsolation()</code>
									uses "
									<code class="literal">SHOW VARIABLES LIKE</code>
									" which is very inefficient on MySQL-5.0+ servers. (Bug #27655)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.get*()</code>
									with a column index &lt; 1 returns misleading error message.
									(Bug #27317)
								</p></li>
							<li class="listitem"><p>
									Fixed issue where calling
									<code class="literal">getGeneratedKeys()</code>
									on a prepared statement after calling
									<code class="literal">execute()</code>
									didn't always return the generated keys (
									<code class="literal">executeUpdate()</code>
									worked fine however). (Bug #27655)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">BIT(&gt; 1)</code>
									is returned as
									<code class="literal">java.lang.String</code>
									from
									<code class="literal">ResultSet.getObject()</code>
									rather than
									<code class="literal">byte[]</code>
									. (Bug #25328)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement</code>
									is not closed in
									<code class="literal">BlobFromLocator.getBytes()</code>
									. (Bug #26592)
								</p></li>
							<li class="listitem"><p>
									Fast date/time parsing doesn't take into account
									<code class="literal">00:00:00</code>
									as a legal value. (Bug #26789)
								</p></li>
							<li class="listitem"><p>Client options not sent
									correctly when using SSL, leading to stored procedures not
									being able to return results. Thanks to Don Cohen for the bug
									report, testcase and patch. (Bug #25545)</p></li>
							<li class="listitem"><p>More useful error messages are
									generated when the driver thinks a result set is not updatable.
									(Thanks to Ashley Martens for the patch). (Bug #28085)</p></li>
							<li class="listitem"><p>
									<code class="literal">
										CALL /* ... */ <em class="replaceable"><code>some_proc</code></em>()
									</code>
									doesn't work. As a side effect of this fix, you can now use
									<code class="literal">/* */</code>
									and
									<code class="literal">#</code>
									comments when preparing statements using client-side prepared
									statement emulation.
								</p>
								<p>
									If the comments happen to contain parameter markers (
									<code class="literal">?</code>
									), they will be treated as belonging to the comment (that is,
									not recognized) rather than being a parameter of the statement.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="note"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Note</div>
									<p xmlns="">
										The statement when sent to the server will contain the
										comments as-is, they're not stripped during the process of
										preparing the
										<code class="literal">PreparedStatement</code>
										or
										<code class="literal">CallableStatement</code>
										.
									</p>
								</div>
								<p>(Bug #27400)</p></li>
							<li class="listitem"><p>Comments in DDL of stored
									procedures/functions confuse procedure parser, and thus
									metadata about them can not be created, leading to inability to
									retrieve said metadata, or execute procedures that have certain
									comments in them. (Bug #26959)</p></li>
							<li class="listitem"><p>
									Using
									<code class="literal">ResultSet.get*()</code>
									with a column index less than 1 returns a misleading error
									message. (Bug #27317)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">CallableStatements</code>
									with
									<code class="literal">OUT/INOUT</code>
									parameters that are "binary" (<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a>,
									<code class="literal">(VAR)BINARY</code>
									,
									<code class="literal">JAVA_OBJECT</code>
									) have extra 7 bytes. (Bug #25715)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.setMaxRows()</code>
									is not effective on result sets materialized from cursors. (Bug
									#25517)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-5"></a>A.2.4. Changes in MySQL Connector/J
									5.0.5 (2007-03-02)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									We've added a new configuration option
									<code class="literal">treatUtilDateAsTimestamp</code>
									, which is
									<code class="literal">false</code>
									by default, as (1) We already had specific behavior to treat
									java.util.Date as a java.sql.Timestamp because it is useful to
									many folks, and (2) that behavior will very likely be required
									for drivers JDBC-post-4.0.
								</p></li>
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">localSocketAddress</code>
									, which is the host name or IP address given to explicitly
									configure the interface that the driver will bind the client
									side of the TCP/IP connection to when connecting.
								</p></li>
							<li class="listitem"><p>
									Fixed logging of XA commands sent to server, it is now
									configurable using
									<code class="literal">logXaCommands</code>
									property (defaults to
									<code class="literal">false</code>
									).
								</p></li>
							<li class="listitem"><p>Usage Advisor now detects empty
									results sets and does not report on columns not referenced in
									those empty sets.</p></li>
							<li class="listitem"><p>
									Improved speed of
									<code class="literal">datetime</code>
									parsing for ResultSets that come from plain or nonserver-side
									prepared statements. You can enable old implementation with
									<code class="literal">useFastDateParsing=false</code>
									as a configuration parameter.
								</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>Important change:</strong></span>
									Due to a number of issues with the use of server-side prepared
									statements, Connector/J 5.0.5 has disabled their use by
									default. The disabling of server-side prepared statements does
									not affect the operation of the connector in any way.
								</p>
								<p>To enable server-side prepared statements, add the
									following configuration property to your connector string:</p>
								<pre class="programlisting">useServerPrepStmts=true</pre>
								<p>
									The default value of this property is
									<code class="literal">false</code>
									(that is, Connector/J does not use server-side prepared
									statements).
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">rewriteBatchedStatements</code>
									feature can now be used with server-side prepared statements.
								</p></li>
							<li class="listitem"><p>
									Usage Advisor will now issue warnings for result sets with
									large numbers of rows. You can configure the trigger value by
									using the
									<code class="literal">resultSetSizeThreshold</code>
									parameter, which has a default value of 100.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>When using a server-side
									prepared statement the driver would send timestamps to the
									server using nanoseconds instead of milliseconds. (Bug #21438)</p></li>
							<li class="listitem"><p>
									Connection property
									<code class="literal">socketFactory</code>
									wasn't exposed using correctly named mutator/accessor, causing
									data source implementations that use JavaBean naming
									conventions to set properties to fail to set the property (and
									in the case of SJAS, fail silently when trying to set this
									parameter). (Bug #26326)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ParameterMetaData</code>
									throws
									<code class="literal">NullPointerException</code>
									when prepared SQL has a syntax error. Added
									<code class="literal">generateSimpleParameterMetadata</code>
									configuration property, which when set to
									<code class="literal">true</code>
									will generate metadata reflecting <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">VARCHAR</code></a> for
									every parameter (the default is
									<code class="literal">false</code>
									, which will cause an exception to be thrown if no parameter
									metadata for the statement is actually available). (Bug #21267)
								</p></li>
							<li class="listitem"><p>Connector/J now returns a better
									error message when server doesn't return enough information to
									determine stored procedure/function parameter types. (Bug
									#24065)</p></li>
							<li class="listitem"><p>
									When using the
									<code class="literal">rewriteBatchedStatements</code>
									connection option with
									<code class="literal">PreparedState.executeBatch()</code>
									an internal memory leak would occur. (Bug #25073)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">EscapeProcessor</code>
									gets confused by multiple backslashes. We now push the
									responsibility of syntax errors back on to the server for most
									escape sequences. (Bug #25399)
								</p></li>
							<li class="listitem"><p>
									Specifying
									<code class="literal">US-ASCII</code>
									as the character set in a connection to a MySQL 4.1 or newer
									server does not map correctly. (Bug #24840)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getSchemas()</code>
									doesn't return a
									<code class="literal">TABLE_CATALOG</code>
									column. (Bug #23303)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">INOUT</code>
									parameters in
									<code class="literal">CallableStatements</code>
									get doubly escaped. (Bug #25379)
								</p></li>
							<li class="listitem"><p>
									Client-side prepared statement parser gets confused by in-line
									comments
									<code class="literal">/*...*/</code>
									and therefore cannot rewrite batch statements or reliably
									detect the type of statements when they are used. (Bug #25025)
								</p></li>
							<li class="listitem"><p>
									Results sets from <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/update.html"
										target="_top"><code class="literal">UPDATE</code></a>
									statements that are part of multi-statement queries would cause
									an
									<code class="literal">SQLException</code>
									error, "Result is from UPDATE". (Bug #25009)
								</p></li>
							<li class="listitem"><p>When using server-side prepared
									statements and timestamp columns, value would be incorrectly
									populated (with nanoseconds, not microseconds). (Bug #21438)</p></li>
							<li class="listitem"><p>
									Some exceptions thrown out of
									<code class="literal">StandardSocketFactory</code>
									were needlessly wrapped, obscuring their true cause, especially
									when using socket timeouts. (Bug #21480)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">StringUtils.indexOfIgnoreCaseRespectQuotes()</code>
									isn't case-insensitive on the first character of the target.
									This bug also affected
									<code class="literal">rewriteBatchedStatements</code>
									functionality when prepared statements did not use uppercase
									for the
									<code class="literal">VALUES</code>
									clause. (Bug #25047)
								</p></li>
							<li class="listitem"><p>
									Using
									<code class="literal">DatabaseMetaData.getSQLKeywords()</code>
									does not return a all of the of the reserved keywords for the
									current MySQL version. Current implementation returns the list
									of reserved words for MySQL 5.1, and does not distinguish
									between versions. (Bug #24794)
								</p></li>
							<li class="listitem"><p>
									A query execution which timed out did not always throw a
									<code class="literal">MySQLTimeoutException</code>
									. (Bug #25836)
								</p></li>
							<li class="listitem"><p>
									A connection error would occur when connecting to a MySQL
									server with certain character sets. Some collations/character
									sets reported as "unknown" (specifically
									<code class="literal">cias</code>
									variants of existing character sets), and inability to override
									the detected server character set. (Bug #23645)
								</p></li>
							<li class="listitem"><p>
									Using
									<code class="literal">setFetchSize()</code>
									breaks prepared <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show.html"
										target="_top"><code class="literal">SHOW</code></a> and other
									commands. (Bug #24360)
								</p></li>
							<li class="listitem"><p>
									Fixed issue where field-level for metadata from
									<code class="literal">DatabaseMetaData</code>
									when using
									<code class="literal">INFORMATION_SCHEMA</code>
									didn't have references to current connections, sometimes
									leading to Null Pointer Exceptions (NPEs) when introspecting
									them using
									<code class="literal">ResultSetMetaData</code>
									. (Bug #25073)
								</p></li>
							<li class="listitem"><p>
									Using <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATETIME</code></a>
									columns would result in time shifts when
									<code class="literal">useServerPrepStmts</code>
									was true. This occurred due to different behavior when using
									client-side compared to server-side prepared statements and the
									<code class="literal">useJDBCCompliantTimezoneShift</code>
									option. This is now fixed if moving from server-side prepared
									statements to client-side prepared statements by setting
									<code class="literal">useSSPSCompatibleTimezoneShift</code>
									to
									<code class="literal">true</code>
									, as the driver can't tell if this is a new deployment that
									never used server-side prepared statements, or if it is an
									existing deployment that is switching to client-side prepared
									statements from server-side prepared statements. (Bug #24344)
								</p></li>
							<li class="listitem"><p>
									When using a JDBC connection URL that is malformed, the
									<code class="literal">NonRegisteringDriver.getPropertyInfo</code>
									method will throw a Null Pointer Exception (NPE). (Bug #22628)
								</p></li>
							<li class="listitem"><p>
									Storing a
									<code class="literal">java.util.Date</code>
									object in a <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> column
									would not be serialized correctly during
									<code class="literal">setObject</code>
									. (Bug #25787)
								</p></li>
							<li class="listitem"><p>
									Inconsistency between
									<code class="literal">getSchemas</code>
									and
									<code class="literal">INFORMATION_SCHEMA</code>
									. (Bug #23304)
								</p></li>
							<li class="listitem"><p>Calendars and timezones are now
									lazily instantiated when required. (Bug #24351)</p></li>
							<li class="listitem"><p>
									Timer instance used for
									<code class="literal">Statement.setQueryTimeout()</code>
									created per-connection, rather than per-VM, causing memory
									leak. (Bug #25514)
								</p></li>
							<li class="listitem"><p>
									Calling
									<code class="literal">Statement.cancel()</code>
									could result in a Null Pointer Exception (NPE). (Bug #24721)
								</p></li>
							<li class="listitem"><p>
									Fixed an issue where
									<code class="literal">XADataSources</code>
									couldn't be bound into JNDI, as the
									<code class="literal">DataSourceFactory</code>
									didn't know how to create instances of them.
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Other Changes</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									When using cached metadata, skip field-level metadata packets
									coming from the server, rather than reading them and discarding
									them without creating
									<code class="literal">com.mysql.jdbc.Field</code>
									instances.
								</p></li>
							<li class="listitem"><p>
									Use a
									<code class="literal">java.util.TreeMap</code>
									to map column names to ordinal indexes for
									<code class="literal">ResultSet.findColumn()</code>
									instead of a HashMap. This enables us to have case-insensitive
									lookups (required by the JDBC specification) without resorting
									to the many transient object instances needed to support this
									requirement with a normal
									<code class="literal">HashMap</code>
									with either case-adjusted keys, or case-insensitive keys. (In
									the worst case scenario for lookups of a 1000 column result
									set, TreeMaps are about half as fast wall-clock time as a
									HashMap, however in normal applications their use gives many
									orders of magnitude reduction in transient object instance
									creation which pays off later for CPU usage in garbage
									collection).
								</p></li>
							<li class="listitem"><p>
									Fixed cases where
									<code class="literal">ServerPreparedStatements</code>
									weren't using cached metadata when
									<code class="literal">cacheResultSetMetadata=true</code>
									was used.
								</p></li>
							<li class="listitem"><p>
									Take
									<code class="literal">localSocketAddress</code>
									property into account when creating instances of
									<code class="literal">CommunicationsException</code>
									when the underlying exception is a
									<code class="literal">java.net.BindException</code>
									, so that a friendlier error message is given with a little
									internal diagnostics.
								</p></li>
							<li class="listitem"><p>
									Fixed some Null Pointer Exceptions (NPEs) when cached metadata
									was used with
									<code class="literal">UpdatableResultSets</code>
									.
								</p></li>
							<li class="listitem"><p>
									When extracting foreign key information from <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-create-table.html"
										target="_top"><code class="literal">SHOW CREATE
											TABLE</code></a> in
									<code class="literal">DatabaseMetaData</code>
									, ignore exceptions relating to tables being missing (which
									could happen for cross-reference or imported-key requests, as
									the list of tables is generated first, then iterated).
								</p></li>
							<li class="listitem"><p>Reverted back to internal
									character conversion routines for single-byte character sets,
									as the ones internal to the JVM are using much more CPU time
									than our internal implementation.</p></li>
							<li class="listitem"><p>
									Changed cached result set metadata (when using
									<code class="literal">cacheResultSetMetadata=true</code>
									) to be cached per-connection rather than per-statement as
									previously implemented.
								</p></li>
							<li class="listitem"><p>
									Throw exceptions encountered during timeout to thread calling
									<code class="literal">Statement.execute*()</code>
									, rather than
									<code class="literal">RuntimeException</code>
									.
								</p></li>
							<li class="listitem"><p>
									Re-worked stored procedure parameter parser to be more robust.
									Driver no longer requires
									<code class="literal">BEGIN</code>
									in stored procedure definition, but does have requirement that
									if a stored function begins with a label directly after the
									"returns" clause, that the label is not a quoted identifier.
								</p></li>
							<li class="listitem"><p>Performance enhancement of
									initial character set configuration, driver will only send
									commands required to configure connection character set session
									variables if the current values on the server do not match what
									is required.</p></li>
							<li class="listitem"><p>Avoid static synchronized code
									in JVM class libraries for dealing with default timezones.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-4"></a>A.2.5. Changes in MySQL Connector/J
									5.0.4 (2006-10-20)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Driver issues truncation on
									write exception when it shouldn't (due to sending big decimal
									incorrectly to server with server-side prepared statement).
									(Bug #22290)</p></li>
							<li class="listitem"><p>Newlines causing whitespace to
									span confuse procedure parser when getting parameter metadata
									for stored procedures. (Bug #22024)</p></li>
							<li class="listitem"><p>Driver was using milliseconds
									for Statement.setQueryTimeout() when specification says
									argument is to be in seconds. (Bug #22359)</p></li>
							<li class="listitem"><p>Added new _ci collations to
									CharsetMapping - utf8_unicode_ci not working. (Bug #22456)</p></li>
							<li class="listitem"><p>Workaround for server crash when
									calling stored procedures using a server-side prepared
									statement (driver now detects prepare(stored procedure) and
									substitutes client-side prepared statement). (Bug #22297)</p></li>
							<li class="listitem"><p>When using information_schema
									for metadata, COLUMN_SIZE for getColumns() is not clamped to
									range of java.lang.Integer as is the case when not using
									information_schema, thus leading to a truncation exception that
									isn't present when not using information_schema. (Bug #21544)</p></li>
							<li class="listitem"><p>DBMD.getColumns() does not
									return expected COLUMN_SIZE for the SET type, now returns
									length of largest possible set disregarding whitespace or the
									"," delimiters to be consistent with the ODBC driver. (Bug
									#22613)</p></li>
							<li class="listitem"><p>
									Column names don't match metadata in cases where server doesn't
									return original column names (column functions) thus breaking
									compatibility with applications that expect 1-to-1 mappings
									between
									<code class="literal">findColumn()</code>
									and
									<code class="literal">rsmd.getColumnName()</code>
									, usually manifests itself as "Can't find column ('')"
									exceptions. (Bug #21379)
								</p></li>
							<li class="listitem"><p>
									Driver now supports
									<code class="literal">{call sp}</code>
									(without "()" if procedure has no arguments).
								</p></li>
							<li class="listitem"><p>
									DatabaseMetaData correctly reports
									<code class="literal">true</code>
									for
									<code class="literal">supportsCatalog*()</code>
									methods.
								</p></li>
							<li class="listitem"><p>
									Fixed configuration property
									<code class="literal">jdbcCompliantTruncation</code>
									was not being used for reads of result set values.
								</p></li>
							<li class="listitem"><p>
									Driver now sends numeric 1 or 0 for client-prepared statement
									<code class="literal">setBoolean()</code>
									calls instead of '1' or '0'.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-3"></a>A.2.6. Changes in MySQL Connector/J
									5.0.3 (2006-07-26, beta)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Functionality Added or
								Changed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added configuration option
									<code class="literal">noAccessToProcedureBodies</code>
									which will cause the driver to create basic parameter metadata
									for
									<code class="literal">CallableStatements</code>
									when the user does not have access to procedure bodies using <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-create-procedure.html"
										target="_top"><code class="literal">SHOW CREATE
											PROCEDURE</code></a> or selecting from
									<code class="literal">mysql.proc</code>
									instead of throwing an exception. The default value for this
									option is
									<code class="literal">false</code>
								</p></li>
						</ul>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">Statement.cancel()</code>
									causes
									<code class="literal">NullPointerException</code>
									if underlying connection has been closed due to server failure.
									(Bug #20650)
								</p></li>
							<li class="listitem"><p>
									If the connection to the server has been closed due to a server
									failure, then the cleanup process will call
									<code class="literal"> Statement.cancel()</code>
									, triggering a
									<code class="literal">NullPointerException</code>
									, even though there is no active connection. (Bug #20650)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-2"></a>A.2.7. Changes in MySQL Connector/J
									5.0.2 (2006-07-11)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">MysqlXaConnection.recover(int
										flags)</code>
									now permits combinations of
									<code class="literal">XAResource.TMSTARTRSCAN</code>
									and
									<code class="literal">TMENDRSCAN</code>
									. To simulate the <span class="quote">“<span
										class="quote">scanning</span>”
									</span> nature of the interface, we return all prepared XIDs for
									<code class="literal">TMSTARTRSCAN</code>
									, and no new XIDs for calls with
									<code class="literal">TMNOFLAGS</code>
									, or
									<code class="literal">TMENDRSCAN</code>
									when not in combination with
									<code class="literal">TMSTARTRSCAN</code>
									. This change was made for API compliance, as well as
									integration with IBM WebSphere's transaction manager. (Bug
									#20242)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">MysqlValidConnectionChecker</code>
									for JBoss doesn't work with
									<code class="literal">MySQLXADataSources</code>
									. (Bug #20242)
								</p></li>
							<li class="listitem"><p>
									Added connection/datasource property
									<code class="literal">pinGlobalTxToPhysicalConnection</code>
									(defaults to
									<code class="literal">false</code>
									). When set to
									<code class="literal">true</code>
									, when using
									<code class="literal">XAConnections</code>
									, the driver ensures that operations on a given XID are always
									routed to the same physical connection. This enables the
									<code class="literal">XAConnection</code>
									to support
									<code class="literal">XA START ... JOIN</code>
									after <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/xa-statements.html"
										target="_top"><code class="literal">XA END</code></a> has been
									called, and is also a workaround for transaction managers that
									don't maintain thread affinity for a global transaction (most
									either always maintain thread affinity, or have it as a
									configuration option). (Bug #20242)
								</p></li>
							<li class="listitem"><p>
									Fixed driver fails on non-ASCII platforms. The driver was
									assuming that the platform character set would be a superset of
									MySQL's
									<code class="literal">latin1</code>
									when doing the handshake for authentication, and when reading
									error messages. We now use Cp1252 for all strings sent to the
									server during the handshake phase, and a hard-coded mapping of
									the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_language"
										target="_top"><code class="literal">language</code></a> system
									variable to the character set that is used for error messages.
									(Bug #18086)
								</p></li>
							<li class="listitem"><p>
									Fixed can't use
									<code class="literal">XAConnection</code>
									for local transactions when no global transaction is in
									progress. (Bug #17401)
								</p></li>
							<li class="listitem"><p>Better caching of character set
									converters (per-connection) to remove a bottleneck for
									multi-byte character sets. (Bug #20242)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ConnectionProperties</code>
									(and thus some subclasses) are not serializable, even though
									some J2EE containers expect them to be. (Bug #19169)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-1"></a>A.2.8. Changes in MySQL Connector/J
									5.0.1 (Not Released)
								</h3>
							</div>
						</div>
					</div>
					<p>Not released due to a packaging error</p>
					<p>Version 5.0.1 has no changelog entries.</p>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-5-0-0"></a>A.2.9. Changes in MySQL Connector/J
									5.0.0 (2005-12-22)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added support for Connector/MXJ integration using url
									subprotocol
									<code class="literal">jdbc:mysql:mxj://...</code>
									. (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Idle timeouts cause
									<code class="literal">XAConnections</code>
									to whine about rolling themselves back. (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									When fix for Bug #14562 was merged from 3.1.12, added
									functionality for
									<code class="literal">CallableStatement</code>
									's parameter metadata to return correct information for
									<code class="literal">.getParameterClassName()</code>
									. (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Added service-provider entry to
									<code class="filename">META-INF/services/java.sql.Driver</code>
									for JDBC-4.0 support. (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Fuller synchronization of
									<code class="literal">Connection</code>
									to avoid deadlocks when using multithreaded frameworks that
									multithread a single connection (usually not recommended, but
									the JDBC spec permits it anyways), part of fix to Bug #14972).
									(Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Moved all
									<code class="literal">SQLException</code>
									constructor usage to a factory in
									<code class="literal">SQLError</code>
									(ground-work for JDBC-4.0
									<code class="literal">SQLState</code>
									-based exception classes). (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Removed Java5-specific calls to
									<code class="literal">BigDecimal</code>
									constructor (when result set value is
									<code class="literal">''</code>
									,
									<code class="literal">(int)0</code>
									was being used as an argument indirectly using method return
									value. This signature doesn't exist prior to Java5.) (Bug
									#14729)
								</p></li>
							<li class="listitem"><p>
									Implementation of
									<code class="literal">Statement.cancel()</code>
									and
									<code class="literal">Statement.setQueryTimeout()</code>
									. Both require MySQL-5.0.0 or newer server, require a separate
									connection to issue the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/kill.html"
										target="_top"><code class="literal">KILL QUERY</code></a>
									statement, and in the case of
									<code class="literal">setQueryTimeout()</code>
									creates an additional thread to handle the timeout
									functionality.
								</p>
								<p>
									Note: Failures to cancel the statement for
									<code class="literal">setQueryTimeout()</code>
									may manifest themselves as
									<code class="literal">RuntimeExceptions</code>
									rather than failing silently, as there is currently no way to
									unblock the thread that is executing the query being cancelled
									due to timeout expiration and have it throw the exception
									instead. (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Return "[VAR]BINARY" for
									<code class="literal">RSMD.getColumnTypeName()</code>
									when that is actually the type, and it can be distinguished
									(MySQL-4.1 and newer). (Bug #14729)
								</p></li>
							<li class="listitem"><p>
									Add one level of indirection of internal representation of
									<code class="literal">CallableStatement</code>
									parameter metadata to avoid class not found issues on JDK-1.3
									for
									<code class="literal">ParameterMetadata</code>
									interface (which doesn't exist prior to JDBC-3.0).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.setString()</code>
									didn't work correctly when <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sql_mode"
										target="_top"><code class="literal">sql_mode</code></a> on
									server contained <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_no_backslash_escapes"
										target="_top"><code class="literal">NO_BACKSLASH_ESCAPES</code></a>
									and no characters that needed escaping were present in the
									string.
								</p></li>
							<li class="listitem"><p>
									Setting
									<code class="literal">useJDBCCompliantTimezoneShift=true</code>
									(it is not the default) causes the driver to use GMT for <span
										class="emphasis"><em>all</em></span> <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATETIME</code></a> time
									zones, and the current VM time zone for any other type that
									refers to time zones. This feature can not be used when
									<code class="literal">useTimezone=true</code>
									to convert between server and client time zones.
								</p></li>
							<li class="listitem"><p>
									Return original column name for
									<code class="literal">RSMD.getColumnName()</code>
									if the column was aliased, alias name for
									<code class="literal">.getColumnLabel()</code>
									(if aliased), and original table name for
									<code class="literal">.getTableName()</code>
									. Note this only works for MySQL-4.1 and newer, as older
									servers don't make this information available to clients.
								</p></li>
							<li class="listitem"><p>
									Moved
									<code class="filename">-bin-g.jar</code>
									file into separate
									<code class="filename">debug</code>
									subdirectory to avoid confusion.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">XADataSource</code>
									implemented (ported from 3.2 branch which won't be released as
									a product). Use
									<code class="literal">com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</code>
									as your datasource class name in your application server to
									utilize XA transactions in MySQL-5.0.10 and newer.
								</p></li>
							<li class="listitem"><p>
									Do not permit
									<code class="literal">.setAutoCommit(true)</code>
									, or
									<code class="literal">.commit()</code>
									or
									<code class="literal">.rollback()</code>
									on an XA-managed connection as per the JDBC specification.
								</p></li>
							<li class="listitem"><p>
									If the connection
									<code class="literal">useTimezone</code>
									is set to
									<code class="literal">true</code>
									, then also respect time zone conversions in escape-processed
									string literals (for example,
									<code class="literal">"{ts ...}"</code>
									and
									<code class="literal">"{t ...}"</code>
									).
								</p></li>
							<li class="listitem"><p>
									Added unit tests for
									<code class="literal">XADatasource</code>
									, as well as friendlier exceptions for XA failures compared to
									the "stock"
									<code class="literal">XAException</code>
									(which has no messages).
								</p></li>
							<li class="listitem"><p>
									Attempt detection of the MySQL type <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">BINARY</code></a> (it is
									an alias, so this isn't always reliable), and use the
									<code class="literal">java.sql.Types.BINARY</code>
									type mapping for it.
								</p></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-3-1-x"></a>A.3. Changes in MySQL Connector/J
								3.1.x
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-3-1-15">A.3.1.
									Changes in MySQL Connector/J 3.1.15 (Not yet released)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-14">A.3.2.
									Changes in MySQL Connector/J 3.1.14 (2006-10-19)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-13">A.3.3.
									Changes in MySQL Connector/J 3.1.13 (2006-05-26)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-12">A.3.4.
									Changes in MySQL Connector/J 3.1.12 (2005-11-30)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-11">A.3.5.
									Changes in MySQL Connector/J 3.1.11 (2005-10-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-10">A.3.6.
									Changes in MySQL Connector/J 3.1.10 (2005-06-23)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-9">A.3.7.
									Changes in MySQL Connector/J 3.1.9 (2005-06-22)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-8">A.3.8.
									Changes in MySQL Connector/J 3.1.8 (2005-04-14)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-7">A.3.9.
									Changes in MySQL Connector/J 3.1.7 (2005-02-18)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-6">A.3.10.
									Changes in MySQL Connector/J 3.1.6 (2004-12-23)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-5">A.3.11.
									Changes in MySQL Connector/J 3.1.5 (2004-12-02)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-4">A.3.12.
									Changes in MySQL Connector/J 3.1.4 (2004-09-04)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-3">A.3.13.
									Changes in MySQL Connector/J 3.1.3 (2004-07-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-2">A.3.14.
									Changes in MySQL Connector/J 3.1.2 (2004-06-09)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-1">A.3.15.
									Changes in MySQL Connector/J 3.1.1 (2004-02-14, alpha)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-1-0">A.3.16.
									Changes in MySQL Connector/J 3.1.0 (2003-02-18, alpha)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-15"></a>A.3.1. Changes in MySQL
									Connector/J 3.1.15 (Not yet released)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Important change:</strong></span> Due
						to a number of issues with the use of server-side prepared
						statements, Connector/J 5.0.5 has disabled their use by default.
						The disabling of server-side prepared statements does not affect
						the operation of the connector in any way.
					</p>
					<p>To enable server-side prepared statements you must add the
						following configuration property to your connector string:</p>
					<pre class="programlisting">useServerPrepStmts=true</pre>
					<p>
						The default value of this property is
						<code class="literal">false</code>
						(that is, Connector/J does not use server-side prepared
						statements).
					</p>
					<p>Version 3.1.15 has no changelog entries.</p>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-14"></a>A.3.2. Changes in MySQL
									Connector/J 3.1.14 (2006-10-19)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Check and store value for
									continueBatchOnError property in constructor of Statements,
									rather than when executing batches, so that Connections closed
									out from underneath statements don't cause
									NullPointerExceptions when it is required to check this
									property. (Bug #22290)</p></li>
							<li class="listitem"><p>Fixed Updatable result set that
									contains a BIT column fails when server-side prepared
									statements are used. (Bug #20485)</p></li>
							<li class="listitem"><p>Escape of quotation marks in
									client-side prepared statements parsing not respected. Patch
									covers more than bug report, including NO_BACKSLASH_ESCAPES
									being set, and stacked quote characters forms of escaping (that
									is, '' or ""). (Bug #20888)</p></li>
							<li class="listitem"><p>Driver now sends numeric 1 or 0
									for client-prepared statement setBoolean() calls instead of '1'
									or '0'. (Bug #22290)</p></li>
							<li class="listitem"><p>Fixed bug where driver would not
									advance to next host if roundRobinLoadBalance=true and the last
									host in the list is down. (Bug #22290)</p></li>
							<li class="listitem"><p>Driver issues truncation on
									write exception when it shouldn't (due to sending big decimal
									incorrectly to server with server-side prepared statement).
									(Bug #22290)</p></li>
							<li class="listitem"><p>ResultSet.getSomeInteger()
									doesn't work for BIT(&gt;1). (Bug #21062)</p></li>
							<li class="listitem"><p>Fixed bug when calling stored
									functions, where parameters weren't numbered correctly (first
									parameter is now the return value, subsequent parameters if
									specified start at index "2"). (Bug #22290)</p></li>
							<li class="listitem"><p>Removed logger autodetection
									altogether, must now specify logger explicitly if you want to
									use a logger other than one that logs to STDERR. (Bug #21207)</p></li>
							<li class="listitem"><p>Fixed can't pool server-side
									prepared statements, exception raised when re-using them. (Bug
									#20687)</p></li>
							<li class="listitem"><p>DDriver throws NPE when tracing
									prepared statements that have been closed (in asSQL()). (Bug
									#21207)</p></li>
							<li class="listitem"><p>Fixed ResultSet.getShort() for
									UNSIGNED TINYINT returns incorrect values when using
									server-side prepared statements. (Bug #20306)</p></li>
							<li class="listitem"><p>ReplicationDriver does not
									always round-robin load balance depending on URL used for
									slaves list. (Bug #19993)</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getTables()</code>
									or
									<code class="literal">getColumns()</code>
									with a bad catalog parameter threw an exception rather than
									return an empty result set (as required by the specification).
									(Bug #18258)
								</p></li>
							<li class="listitem"><p>Fixed memory leak with
									profileSQL=true. (Bug #16987)</p></li>
							<li class="listitem"><p>Connection fails to localhost
									when using timeout and IPv6 is configured. (Bug #19726)</p></li>
							<li class="listitem"><p>Fixed updatable result set
									throws ClassCastException when there is row data and
									moveToInsertRow() is called. (Bug #20479)</p></li>
							<li class="listitem"><p>Fixed calling toString() on
									ResultSetMetaData for driver-generated (that is, from
									DatabaseMetaData method calls, or from getGeneratedKeys())
									result sets would raise a NullPointerException. (Bug #19993)</p></li>
							<li class="listitem"><p>Fixed NullPointerException in
									MysqlDataSourceFactory due to Reference containing RefAddrs
									with null content. (Bug #16791)</p></li>
							<li class="listitem"><p>ResultSet.getFloatFromString()
									can't retrieve values near Float.MIN/MAX_VALUE. (Bug #18880)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-13"></a>A.3.3. Changes in MySQL
									Connector/J 3.1.13 (2006-05-26)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added performance feature, re-writing of batched executes for
									<code class="literal">Statement.executeBatch()</code>
									(for all DML statements) and
									<code class="literal">PreparedStatement.executeBatch()</code>
									(for INSERTs with VALUE clauses only). Enable by using
									"rewriteBatchedStatements=true" in your JDBC URL. (Bug #18041)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getColumns()</code>
									returns wrong type for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a>. (Bug
									#15854)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.setObject()</code>
									serializes
									<code class="literal">BigInteger</code>
									as object, rather than sending as numeric value (and is thus
									not complementary to
									<code class="literal">.getObject()</code>
									on an
									<code class="literal">UNSIGNED LONG</code>
									type). (Bug #15383)
								</p></li>
							<li class="listitem"><p>Fixed aliased column names where
									length of name &gt; 251 are corrupted. (Bug #18554)</p></li>
							<li class="listitem"><p>Exception thrown for new decimal
									type when using updatable result sets. (Bug #14609)</p></li>
							<li class="listitem"><p>
									Improved performance of retrieving
									<code class="literal">BigDecimal</code>
									,
									<code class="literal">Time</code>
									,
									<code class="literal">Timestamp</code>
									and
									<code class="literal">Date</code>
									values from server-side prepared statements by creating fewer
									short-lived instances of
									<code class="literal">Strings</code>
									when the native type is not an exact match for the requested
									type. (Bug #18496)
								</p></li>
							<li class="listitem"><p>
									Fixed calling
									<code class="literal">clearParameters()</code>
									on a closed prepared statement causes NPE. (Bug #17587)
								</p></li>
							<li class="listitem"><p>
									Driver now aware of fix for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a> type
									metadata that went into MySQL-5.0.21 for server not reporting
									length consistently . (Bug #13601)
								</p></li>
							<li class="listitem"><p>No "dos" character set in MySQL
									&gt; 4.1.0. (Bug #15544)</p></li>
							<li class="listitem"><p>Map "latin1" on MySQL server to
									CP1252 for MySQL &gt; 4.1.0. (Bug #17587)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">CallableStatement.registerOutParameter()</code>
									not working when some parameters pre-populated. Still waiting
									for feedback from JDBC experts group to determine what correct
									parameter count from
									<code class="literal">getMetaData()</code>
									should be, however. (Bug #17898)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.wasNull()</code>
									not always reset correctly for booleans when done using
									conversion for server-side prepared statements. (Bug #17450)
								</p></li>
							<li class="listitem"><p>Added support for Apache Commons
									logging, use "com.mysql.jdbc.log.CommonsLogger" as the value
									for the "logger" configuration property. (Bug #13469)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.wasNull()</code>
									returns incorrect value when extracting native string from
									server-side prepared statement generated result set. (Bug
									#19282)
								</p></li>
							<li class="listitem"><p>
									Fixed updatable result set doesn't return
									<code class="literal">AUTO_INCREMENT</code>
									values for
									<code class="literal">insertRow()</code>
									when multiple column primary keys are used. (the driver was
									checking for the existence of single-column primary keys and an
									autoincrement value &gt; 0 instead of a straightforward
									<code class="literal">isAutoIncrement()</code>
									check). (Bug #16841)
								</p></li>
							<li class="listitem"><p>
									Fixed invalid classname returned for
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									for
									<code class="literal">BIGINT type</code>
									. (Bug #19282)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">INOUT</code>
									parameter does not store
									<code class="literal">IN</code>
									value. (Bug #15464)
								</p></li>
							<li class="listitem"><p>
									Fixed issue with
									<code class="literal">ReplicationConnection</code>
									incorrectly copying state, doesn't transfer connection context
									correctly when transitioning between the same read-only states.
									(Bug #15570)
								</p></li>
							<li class="listitem"><p>Fixed case where driver wasn't
									reading server status correctly when fetching server-side
									prepared statement rows, which in some cases could cause
									warning counts to be off, or multiple result sets to not be
									read off the wire. (Bug #19282)</p></li>
							<li class="listitem"><p>
									<code class="literal">Fixed
										PreparedStatement.setObject(int, Object, int)</code>
									doesn't respect scale of BigDecimals. (Bug #19615)
								</p></li>
							<li class="listitem"><p>Fixed driver trying to call
									methods that don't exist on older and newer versions of Log4j.
									The fix is not trying to auto-detect presence of log4j, too
									many different incompatible versions out there in the wild to
									do this reliably.</p>
								<p>If you relied on autodetection before, you will need to
									add "logger=com.mysql.jdbc.log.Log4JLogger" to your JDBC URL to
									enable Log4J usage, or alternatively use the new
									"CommonsLogger" class to take care of this. (Bug #13469)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">Statement.getGeneratedKeys()</code>
									throws
									<code class="literal">NullPointerException</code>
									when no query has been processed. (Bug #17099)
								</p></li>
							<li class="listitem"><p>
									<code class="filename">lib-nodist</code>
									directory missing from package breaks out-of-box build. (Bug
									#15676)
								</p></li>
							<li class="listitem"><p>Added additional accessor and
									mutator methods on ConnectionProperties so that DataSource
									users can use same naming as regular URL properties. (Bug
									#17587)</p></li>
							<li class="listitem"><p>
									LogFactory now prepends
									<code class="literal">com.mysql.jdbc.log</code>
									to the log class name if it cannot be found as specified. This
									enables you to use <span class="quote">“<span
										class="quote">short names</span>”
									</span> for the built-in log factories, for example,
									<code class="literal">logger=CommonsLogger</code>
									instead of
									<code class="literal">logger=com.mysql.jdbc.log.CommonsLogger</code>
									. (Bug #13469)
								</p></li>
							<li class="listitem"><p>
									Fixed data truncation and
									<code class="literal">getWarnings()</code>
									only returns last warning in set. (Bug #18740)
								</p></li>
							<li class="listitem"><p>Fixed issue where server-side
									prepared statements don't cause truncation exceptions to be
									thrown when truncation happens. (Bug #18041)</p></li>
							<li class="listitem"><p>
									Fixed issue where driver was unable to initialize character set
									mapping tables. Removed reliance on
									<code class="literal">.properties</code>
									files to hold this information, as it turns out to be too
									problematic to code around class loader hierarchies that change
									depending on how an application is deployed. Moved information
									back into the
									<code class="literal">CharsetMapping</code>
									class. (Bug #14938)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getShort()</code>
									for
									<code class="literal">UNSIGNED TINYINT</code>
									returned wrong values. (Bug #11874)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-12"></a>A.3.4. Changes in MySQL
									Connector/J 3.1.12 (2005-11-30)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Driver incorrectly closes streams passed as arguments to
									<code class="literal">PreparedStatements</code>
									. Reverts to legacy behavior by setting the JDBC configuration
									property
									<code class="literal">autoClosePStmtStreams</code>
									to
									<code class="literal">true</code>
									(also included in the 3-0-Compat configuration <span
										class="quote">“<span class="quote">bundle</span>”
									</span>). (Bug #15024)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesMixedCaseIdentifiers()</code>
									returns
									<code class="literal">false</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesLowerCaseIdentifiers()</code>
									returns
									<code class="literal">true</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>Deadlock while closing
									server-side prepared statements from multiple threads sharing
									one connection. (Bug #14972)</p></li>
							<li class="listitem"><p>
									OpenOffice expects
									<code class="literal">DBMD.supportsIntegrityEnhancementFacility()</code>
									to return
									<code class="literal">true</code>
									if foreign keys are supported by the datasource, even though
									this method also covers support for check constraints, which
									MySQL <span class="emphasis"><em>doesn't</em></span> have.
									Setting the configuration property
									<code class="literal">overrideSupportsIntegrityEnhancementFacility</code>
									to
									<code class="literal">true</code>
									causes the driver to return
									<code class="literal">true</code>
									for this method. (Bug #12975)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
									returns
									<code class="literal">false</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
									returns
									<code class="literal">true</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">maxQuerySizeToLog</code>
									is not respected. Added logging of bound values for
									<code class="literal">execute()</code>
									phase of server-side prepared statements when
									<code class="literal">profileSQL=true</code>
									as well. (Bug #13048)
								</p></li>
							<li class="listitem"><p>
									Process escape tokens in
									<code class="literal">Connection.prepareStatement(...)</code>
									. You can disable this behavior by setting the JDBC URL
									configuration property
									<code class="literal">processEscapeCodesForPrepStmts</code>
									to
									<code class="literal">false</code>
									. (Bug #15141)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									doesn't return
									<code class="literal">TABLE_NAME</code>
									correctly. (Bug #14815)
								</p></li>
							<li class="listitem"><p>
									If
									<code class="literal">lower_case_table_names=0</code>
									(on server):
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">storesLowerCaseIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesMixedCaseIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesUpperCaseIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesUpperCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
									</ul>
								</div>
								<p>(Bug #14562)</p></li>
							<li class="listitem"><p>
									<code class="literal">storesUpperCaseIdentifiers()</code>
									returns
									<code class="literal">false</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesUpperCaseQuotedIdentifiers()</code>
									returns
									<code class="literal">true</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									If
									<code class="literal">lower_case_table_names=1</code>
									(on server):
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">storesLowerCaseIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesMixedCaseIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesUpperCaseIdentifiers()</code>
												returns
												<code class="literal">false</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">storesUpperCaseQuotedIdentifiers()</code>
												returns
												<code class="literal">true</code>
											</p></li>
									</ul>
								</div>
								<p>(Bug #14562)</p></li>
							<li class="listitem"><p>
									Extraneous sleep on
									<code class="literal">autoReconnect</code>
									. (Bug #13775)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
									returns
									<code class="literal">true</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DatabaseMetaData.stores*Identifiers()</code>
									:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												If
												<code class="literal">lower_case_table_names=0</code>
												(on server):
											</p>
											<div class="itemizedlist">
												<ul class="itemizedlist" style="list-style-type: square;">
													<li class="listitem"><p>
															<code class="literal">storesLowerCaseIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesMixedCaseIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesUpperCaseIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesUpperCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
												</ul>
											</div></li>
										<li class="listitem"><p>
												If
												<code class="literal">lower_case_table_names=1</code>
												(on server):
											</p>
											<div class="itemizedlist">
												<ul class="itemizedlist" style="list-style-type: square;">
													<li class="listitem"><p>
															<code class="literal">storesLowerCaseIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesMixedCaseIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesMixedCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesUpperCaseIdentifiers()</code>
															returns
															<code class="literal">false</code>
														</p></li>
													<li class="listitem"><p>
															<code class="literal">storesUpperCaseQuotedIdentifiers()</code>
															returns
															<code class="literal">true</code>
														</p></li>
												</ul>
											</div></li>
									</ul>
								</div>
								<p>(Bug #14562)</p></li>
							<li class="listitem"><p>
									Reconnect during middle of
									<code class="literal">executeBatch()</code>
									should not occur if
									<code class="literal">autoReconnect</code>
									is enabled. (Bug #13255)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">storesMixedCaseIdentifiers()</code>
									returns
									<code class="literal">true</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>Usage advisor complains about
									unreferenced columns, even though they've been referenced. (Bug
									#15065)</p></li>
							<li class="listitem"><p>
									<code class="literal">storesLowerCaseQuotedIdentifiers()</code>
									returns
									<code class="literal">false</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>
									Java type conversion may be incorrect for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">MEDIUMINT</code></a>. (Bug
									#14562)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">com.mysql.jdbc.testsuite.url.default</code>
									system property to set default JDBC url for testsuite (to speed
									up bug resolution when I'm working in Eclipse). (Bug #12975)
								</p></li>
							<li class="listitem"><p>Unable to initialize character
									set mapping tables (due to J2EE classloader differences). (Bug
									#14938)</p></li>
							<li class="listitem"><p>
									<code class="literal">storesLowerCaseIdentifiers()</code>
									returns
									<code class="literal">false</code>
									(Bug #14562)
								</p></li>
							<li class="listitem"><p>Escape processor replaces quote
									character in quoted string with string delimiter. (Bug #14909)</p></li>
							<li class="listitem"><p>
									Added configuration property
									<code class="literal">useGmtMillisForDatetimes</code>
									which when set to
									<code class="literal">true</code>
									causes
									<code class="literal">ResultSet.getDate()</code>
									,
									<code class="literal">.getTimestamp()</code>
									to return correct millis-since GMT when
									<code class="literal">.getTime()</code>
									is called on the return value (currently default is
									<code class="literal">false</code>
									for legacy behavior). (Bug #14562)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">logSlowQueries</code>
									should give better info. (Bug #12230)
								</p></li>
							<li class="listitem"><p>Don't increase timeout for
									failover/reconnect. (Bug #6577)</p></li>
							<li class="listitem"><p>
									Fall back to platform-encoding for
									<code class="literal">URLDecoder.decode()</code>
									when parsing driver URL properties if the platform doesn't have
									a two-argument version of this method.
								</p></li>
							<li class="listitem"><p>
									Do not permit
									<code class="literal">executeBatch()</code>
									for
									<code class="literal">CallableStatements</code>
									with registered
									<code class="literal">OUT</code>
									/
									<code class="literal">INOUT</code>
									parameters (JDBC compliance).
								</p></li>
							<li class="listitem"><p>
									Fixed client-side prepared statement bug with embedded
									<code class="literal">?</code>
									characters inside quoted identifiers (it was recognized as a
									placeholder, when it was not).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-11"></a>A.3.5. Changes in MySQL
									Connector/J 3.1.11 (2005-10-07)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">getExportedKeys()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>Specifying a catalog works as
									stated in the API docs. (Bug #12541)</p></li>
							<li class="listitem"><p>
									Specifying
									<code class="literal">NULL</code>
									means that catalog will not be used to filter the results (thus
									all databases will be searched), unless you've set
									<code class="literal">nullCatalogMeansCurrent=true</code>
									in your JDBC URL properties. (Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Tokenizer for
									<code class="literal">=</code>
									in URL properties was causing
									<code class="literal">sessionVariables=....</code>
									to be parameterized incorrectly. (Bug #12753)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getIndexInfo()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getProcedures()</code>
									(and thus indirectly
									<code class="literal">getProcedureColumns()</code>
									) (Bug #12541)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getImportedKeys()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Specifying
									<code class="literal">""</code>
									means <span class="quote">“<span class="quote">current</span>”
									</span> catalog, even though this isn't quite JDBC spec compliant, it
									is there for legacy users. (Bug #12541)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getCrossReference()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									The configuration property
									<code class="literal">sessionVariables</code>
									now permits you to specify variables that start with the <span
										class="quote">“<span class="quote"><code
												class="literal">@</code></span>”
									</span> sign. (Bug #13453)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">Connection.isMasterConnection()</code>
									for clients to be able to determine if a multi-host
									master/slave connection is connected to the first host in the
									list. (Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Workaround for Bug #13374:
									<code class="literal">ResultSet.getStatement()</code>
									on closed result set returns
									<code class="literal">NULL</code>
									(as per JDBC 4.0 spec, but not backward-compatible). Set the
									connection property
									<code class="literal">retainStatementAfterResultSetClose</code>
									to
									<code class="literal">true</code>
									to be able to retrieve a
									<code class="literal">ResultSet</code>
									's statement after the
									<code class="literal">ResultSet</code>
									has been closed using
									<code class="literal">.getStatement()</code>
									(the default is
									<code class="literal">false</code>
									, to be JDBC-compliant and to reduce the chance that code using
									JDBC leaks
									<code class="literal">Statement</code>
									instances). (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">java.sql.Types.OTHER</code>
									returned for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">BINARY</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a>
									columns when using
									<code class="literal">DatabaseMetaData.getColumns()</code>
									. (Bug #12970)
								</p></li>
							<li class="listitem"><p>
									URL configuration parameters do not permit <span class="quote">“<span
										class="quote"><code class="literal">&amp;</code></span>”
									</span> or <span class="quote">“<span class="quote"><code
												class="literal">=</code></span>”
									</span> in their values. The JDBC driver now parses configuration
									parameters as if they are encoded using the
									application/x-www-form-urlencoded format as specified by
									<code class="literal">java.net.URLDecoder</code>
									(<a class="ulink"
										href="http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLDecoder.html"
										target="_top">http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLDecoder.html</a>).
								</p>
								<p>
									If the <span class="quote">“<span class="quote"><code
												class="literal">%</code></span>”
									</span> character is present in a configuration property, it must now
									be represented as
									<code class="literal">%25</code>
									, which is the encoded form of <span class="quote">“<span
										class="quote"><code class="literal">%</code></span>”
									</span> when using application/x-www-form-urlencoded encoding. (Bug
									#13453)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getColumns()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Handling of catalog argument in
									<code class="literal">DatabaseMetaData.getIndexInfo()</code>
									, which also means changes to the following methods in
									<code class="literal">DatabaseMetaData</code>
									:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">getBestRowIdentifier()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getColumns()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getCrossReference()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getExportedKeys()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getImportedKeys()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getIndexInfo()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getPrimaryKeys()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getProcedures()</code>
												(and thus indirectly
												<code class="literal">getProcedureColumns()</code>
												)
											</p></li>
										<li class="listitem"><p>
												<code class="literal">getTables()</code>
											</p></li>
									</ul>
								</div>
								<p>
									The
									<code class="literal">catalog</code>
									argument in all of these methods now behaves in the following
									way:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												Specifying
												<code class="literal">NULL</code>
												means that catalog will not be used to filter the results
												(thus all databases will be searched), unless you've set
												<code class="literal">nullCatalogMeansCurrent=true</code>
												in your JDBC URL properties.
											</p></li>
										<li class="listitem"><p>
												Specifying
												<code class="literal">""</code>
												means <span class="quote">“<span class="quote">current</span>”
												</span> catalog, even though this isn't quite JDBC spec compliant,
												it is there for legacy users.
											</p></li>
										<li class="listitem"><p>Specifying a catalog works as
												stated in the API docs.</p></li>
										<li class="listitem"><p>
												Made
												<code class="literal">Connection.clientPrepare()</code>
												available from <span class="quote">“<span
													class="quote">wrapped</span>”
												</span> connections in the
												<code class="literal">jdbc2.optional</code>
												package (connections built by
												<code class="literal">ConnectionPoolDataSource</code>
												instances).
											</p></li>
									</ul>
								</div>
								<p>(Bug #12541)</p></li>
							<li class="listitem"><p>
									<code class="literal">getBestRowIdentifier()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">Connection.clientPrepare()</code>
									available from <span class="quote">“<span class="quote">wrapped</span>”
									</span> connections in the
									<code class="literal">jdbc2.optional</code>
									package (connections built by
									<code class="literal">ConnectionPoolDataSource</code>
									instances). (Bug #12541)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerPreparedStatement.getBinding()</code>
									now checks if the statement is closed before attempting to
									reference the list of parameter bindings, to avoid throwing a
									<code class="literal">NullPointerException</code>
									. (Bug #12970)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSetMetaData</code>
									from
									<code class="literal">Statement.getGeneratedKeys()</code>
									caused a
									<code class="literal">NullPointerException</code>
									to be thrown whenever a method that required a connection
									reference was called. (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">cp1251</code>
									incorrectly mapped to
									<code class="literal">win1251</code>
									for servers newer than 4.0.x. (Bug #12752)
								</p></li>
							<li class="listitem"><p>
									When
									<code class="literal">gatherPerfMetrics</code>
									is enabled for servers older than 4.1.0, a
									<code class="literal">NullPointerException</code>
									is thrown from the constructor of
									<code class="literal">ResultSet</code>
									if the query doesn't use any tables. (Bug #13043)
								</p></li>
							<li class="listitem"><p>
									Backport of
									<code class="literal">VAR[BINARY|CHAR] [BINARY]</code>
									types detection from 5.0 branch. (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getTables()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">NullPointerException</code>
									when converting
									<code class="literal">catalog</code>
									parameter in many
									<code class="literal">DatabaseMetaDataMethods</code>
									to
									<code class="literal">byte[]</code>
									s (for the result set) when the parameter is
									<code class="literal">null</code>
									. (
									<code class="literal">null</code>
									is not technically permitted by the JDBC specification, but we
									have historically permitted it). (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									Backport of
									<code class="literal">Field</code>
									class,
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									, and
									<code class="literal">ResultSet.getObject(int)</code>
									changes from 5.0 branch to fix behavior surrounding
									<code class="literal">VARCHAR BINARY</code>
									/<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a> and
									related types. (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									Read response in
									<code class="literal">MysqlIO.sendFileToServer()</code>
									, even if the local file can't be opened, otherwise next query
									issued will fail, because it is reading the response to the
									empty <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
										target="_top"><code class="literal">LOAD DATA
											INFILE</code></a> packet sent to the server. (Bug #13277)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.prepareCall()</code>
									is database name case-sensitive (on Windows systems). (Bug
									#12417)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getPrimaryKeys()</code>
									(Bug #12541)
								</p></li>
							<li class="listitem"><p>Geometry types not handled with
									server-side prepared statements. (Bug #12104)</p></li>
							<li class="listitem"><p>
									<code class="literal">explainSlowQueries</code>
									hangs with server-side prepared statements. (Bug #12229)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Pstmt.setObject(....,
										Types.BOOLEAN)</code>
									throws exception. (Bug #11798)
								</p></li>
							<li class="listitem"><p>
									Reworked
									<code class="literal">Field</code>
									class,
									<code class="literal">*Buffer</code>
									, and
									<code class="literal">MysqlIO</code>
									to be aware of field lengths &gt;
									<code class="literal">Integer.MAX_VALUE</code>
									. (Bug #11498)
								</p></li>
							<li class="listitem"><p>
									Foreign key information that is quoted is parsed incorrectly
									when
									<code class="literal">DatabaseMetaData</code>
									methods use that information. (Bug #11781)
								</p></li>
							<li class="listitem"><p>Fixed regression caused by fix
									for Bug #11552 that caused driver to return incorrect values
									for unsigned integers when those integers where within the
									range of the positive signed type. (Bug #11663)</p></li>
							<li class="listitem"><p>Escape tokenizer doesn't respect
									stacked single quotation marks for escapes. (Bug #11797)</p></li>
							<li class="listitem"><p>Escape processor didn't honor
									strings demarcated with double quotation marks. (Bug #11498)</p></li>
							<li class="listitem"><p>
									<code class="literal">maxPerformance.properties</code>
									mis-spells <span class="quote">“<span class="quote">elideSetAutoCommits</span>”
									</span>. (Bug #11976)
								</p></li>
							<li class="listitem"><p>Moved source code to Subversion
									repository. (Bug #11663)</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">sendBlobChunkSize</code>
									property is now clamped to <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>
									with consideration of stream buffer size and packet headers to
									avoid
									<code class="literal">PacketTooBigExceptions</code>
									when <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>
									is similar in size to the default
									<code class="literal">sendBlobChunkSize</code>
									which is 1M. (Bug #11781)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.getWarnings()</code>
									fails with NPE if statement has been closed. (Bug #10630)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.storesLower/Mixed/UpperIdentifiers()</code>
									reports incorrect values for servers deployed on Windows. (Bug
									#11575)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.moveToCurrentRow()</code>
									fails to work when preceded by a call to
									<code class="literal">ResultSet.moveToInsertRow()</code>
									. (Bug #11190)
								</p></li>
							<li class="listitem"><p>
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a> data
									corrupted when using server-side prepared statements and
									<code class="literal">.setBytes()</code>
									. (Bug #11115)
								</p></li>
							<li class="listitem"><p>
									Only get
									<code class="literal">char[]</code>
									from SQL in
									<code class="literal">PreparedStatement.ParseInfo()</code>
									when needed. (Bug #10630)
								</p></li>
							<li class="listitem"><p>Incorrect generation of testcase
									scripts for server-side prepared statements. (Bug #11663)</p></li>
							<li class="listitem"><p>
									<code class="literal">GEOMETRY</code>
									type not recognized when using server-side prepared statements.
									(Bug #11797)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">CallableStatement.clearParameters()</code>
									now clears resources associated with
									<code class="literal">INOUT</code>
									/
									<code class="literal">OUTPUT</code>
									parameters as well as
									<code class="literal">INPUT</code>
									parameters. (Bug #11781)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">StringUtils.getBytes()</code>
									doesn't work when using multi-byte character encodings and a
									length in <span class="emphasis"><em>characters</em></span> is
									specified. (Bug #11614)
								</p></li>
							<li class="listitem"><p>
									Fixed statements generated for testcases missing
									<code class="literal">;</code>
									for <span class="quote">“<span class="quote">plain</span>”
									</span> statements. (Bug #11629)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ReplicationConnection</code>
									won't switch to slave, throws <span class="quote">“<span
										class="quote">Catalog can't be null</span>”
									</span> exception. (Bug #11879)
								</p></li>
							<li class="listitem"><p>
									Spurious
									<code class="literal">!</code>
									on console when character encoding is
									<code class="literal">utf8</code>
									. (Bug #11629)
								</p></li>
							<li class="listitem"><p>Properties shared between master
									and slave with replication connection. (Bug #12218)</p></li>
							<li class="listitem"><p>
									Updated
									<code class="literal">DBMD.supportsCorrelatedQueries()</code>
									to return
									<code class="literal">true</code>
									for versions &gt; 4.1,
									<code class="literal">supportsGroupByUnrelated()</code>
									to return
									<code class="literal">true</code>
									and
									<code class="literal">getResultSetHoldability()</code>
									to return
									<code class="literal">HOLD_CURSORS_OVER_COMMIT</code>
									. (Bug #11498)
								</p></li>
							<li class="listitem"><p>
									Lifted restriction of changing streaming parameters with
									server-side prepared statements. As long as
									<code class="literal">all</code>
									streaming parameters were set before execution,
									<code class="literal">.clearParameters()</code>
									does not have to be called. (due to limitation of client/server
									protocol, prepared statements can not reset <span
										class="emphasis"><em>individual</em></span> stream data on the
									server side). (Bug #11498)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-10"></a>A.3.6. Changes in MySQL
									Connector/J 3.1.10 (2005-06-23)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed connecting without a database specified raised an
									exception in
									<code class="literal">MysqlIO.changeDatabaseTo()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Initial implemention of
									<code class="literal">ParameterMetadata</code>
									for
									<code class="literal">PreparedStatement.getParameterMetadata()</code>
									. Only works fully for
									<code class="literal">CallableStatements</code>
									, as current server-side prepared statements return every
									parameter as a <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">VARCHAR</code></a> type.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-9"></a>A.3.7. Changes in MySQL Connector/J
									3.1.9 (2005-06-22)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">PreparedStatement.setClob()</code>
									not accepting
									<code class="literal">null</code>
									as a parameter. (Bug #11360)
								</p></li>
							<li class="listitem"><p>Actually write manifest file to
									correct place so it ends up in the binary jar file. (Bug
									#10144)</p></li>
							<li class="listitem"><p>
									Try to handle
									<code class="literal">OutOfMemoryErrors</code>
									more gracefully. Although not much can be done, they will in
									most cases close the connection they happened on so that
									further operations don't run into a connection in some unknown
									state. When an OOM has happened, any further operations on the
									connection will fail with a <span class="quote">“<span
										class="quote">Connection closed</span>”
									</span> exception that will also list the OOM exception as the reason
									for the implicit connection close event. (Bug #10850)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">autoReconnect</code>
									ping causes exception on connection startup. (Bug #11259)
								</p></li>
							<li class="listitem"><p>
									Reorganized directory layout. Sources now are in
									<code class="filename">src</code>
									folder. Don't pollute parent directory when building, now
									output goes to
									<code class="filename">./build</code>
									, distribution goes to
									<code class="filename">./dist</code>
									. (Bug #10496)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.setCatalog()</code>
									is now aware of the
									<code class="literal">useLocalSessionState</code>
									configuration property, which when set to
									<code class="literal">true</code>
									will prevent the driver from sending
									<code class="literal">USE ...</code>
									to the server if the requested catalog is the same as the
									current catalog. (Bug #11115)
								</p></li>
							<li class="listitem"><p>
									Setting
									<code class="literal">cachePrepStmts=true</code>
									now causes the
									<code class="literal">Connection</code>
									to also cache the check the driver performs to determine if a
									prepared statement can be server-side or not, as well as caches
									server-side prepared statements for the lifetime of a
									connection. As before, the
									<code class="literal">prepStmtCacheSize</code>
									parameter controls the size of these caches. (Bug #10850)
								</p></li>
							<li class="listitem"><p>
									Don't send
									<code class="literal">COM_RESET_STMT</code>
									for each execution of a server-side prepared statement if it
									isn't required. (Bug #10850)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">3-0-Compat</code>
									: Compatibility with Connector/J 3.0.x functionality (Bug
									#11115)
								</p></li>
							<li class="listitem"><p>Production package doesn't
									include JBoss integration classes. (Bug #11411)</p></li>
							<li class="listitem"><p>
									<code class="literal">maxPerformance</code>
									: Maximum performance without being reckless (Bug #11115)
								</p></li>
							<li class="listitem"><p>
									Unsigned <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">SMALLINT</code></a>
									treated as signed for
									<code class="literal">ResultSet.getInt()</code>
									, fixed all cases for
									<code class="literal">UNSIGNED</code>
									integer values and server-side prepared statements, as well as
									<code class="literal">ResultSet.getObject()</code>
									for
									<code class="literal">UNSIGNED TINYINT</code>
									. (Bug #10156)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">solarisMaxPerformance</code>
									: Maximum performance for Solaris, avoids syscalls where it can
									(Bug #11115)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">maintainTimeStats</code>
									configuration property (defaults to
									<code class="literal">true</code>
									), which tells the driver whether or not to keep track of the
									last query time and the last successful packet sent to the
									server's time. If set to
									<code class="literal">false</code>
									, removes two syscalls per query. (Bug #11115)
								</p></li>
							<li class="listitem"><p>0-length streams not sent to
									server when using server-side prepared statements. (Bug #10850)</p></li>
							<li class="listitem"><p>
									The data type returned for
									<code class="literal">TINYINT(1)</code>
									columns when
									<code class="literal">tinyInt1isBit=true</code>
									(the default) can be switched between
									<code class="literal">Types.BOOLEAN</code>
									and
									<code class="literal">Types.BIT</code>
									using the new configuration property
									<code class="literal">transformedBitIsBoolean</code>
									, which defaults to
									<code class="literal">false</code>
									. If set to
									<code class="literal">false</code>
									(the default),
									<code class="literal">DatabaseMetaData.getColumns()</code>
									and
									<code class="literal">ResultSetMetaData.getColumnType()</code>
									will return
									<code class="literal">Types.BOOLEAN</code>
									for
									<code class="literal">TINYINT(1)</code>
									columns. If
									<code class="literal">true</code>
									,
									<code class="literal">Types.BOOLEAN</code>
									will be returned instead. Regardless of this configuration
									property, if
									<code class="literal">tinyInt1isBit</code>
									is enabled, columns with the type
									<code class="literal">TINYINT(1)</code>
									will be returned as
									<code class="literal">java.lang.Boolean</code>
									instances from
									<code class="literal">ResultSet.getObject(...)</code>
									, and
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									will return
									<code class="literal">java.lang.Boolean</code>
									. (Bug #10485)
								</p></li>
							<li class="listitem"><p>
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a> data
									corrupted when using server-side prepared statements and
									<code class="literal">ResultSet.getBytes()</code>
									. (Bug #11115)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">createDatabaseIfNotExist</code>
									property (default is
									<code class="literal">false</code>
									), which will cause the driver to ask the server to create the
									database specified in the URL if it doesn't exist. You must
									have the appropriate privileges for database creation for this
									to work. (Bug #10144)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">SQLException</code>
									thrown when retrieving
									<code class="literal">YEAR(2)</code>
									with
									<code class="literal">ResultSet.getString()</code>
									. The driver will now always treat <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/year.html"
										target="_top"><code class="literal">YEAR</code></a> types as
									<code class="literal">java.sql.Dates</code>
									and return the correct values for
									<code class="literal">getString()</code>
									. Alternatively, the
									<code class="literal">yearIsDateType</code>
									connection property can be set to
									<code class="literal">false</code>
									and the values will be treated as
									<code class="literal">SHORT</code>
									s. (Bug #10485)
								</p></li>
							<li class="listitem"><p>
									Connector/J dumping query into
									<code class="literal">SQLException</code>
									twice. (Bug #11360)
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">ServerPreparedStatement.asSql()</code>
									work correctly so auto-explain functionality would work with
									server-side prepared statements. (Bug #10155)
								</p></li>
							<li class="listitem"><p>Double quotation marks not
									recognized when parsing client-side prepared statements. (Bug
									#10155)</p></li>
							<li class="listitem"><p>
									Removed nonsensical <span class="quote">“<span
										class="quote">costly type conversion</span>”
									</span> warnings when using usage advisor. (Bug #11411)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">com.mysql.jdbc.PreparedStatement.ParseInfo</code>
									does unnecessary call to
									<code class="literal">toCharArray()</code>
									. (Bug #9064)
								</p></li>
							<li class="listitem"><p>
									Driver doesn't support
									<code class="literal">{?=CALL(...)}</code>
									for calling stored functions. This involved adding support for
									function retrieval to
									<code class="literal">DatabaseMetaData.getProcedures()</code>
									and
									<code class="literal">getProcedureColumns()</code>
									as well. (Bug #10310)
								</p></li>
							<li class="listitem"><p>
									Memory leak in
									<code class="literal">ServerPreparedStatement</code>
									if
									<code class="literal">serverPrepare()</code>
									fails. (Bug #10144)
								</p></li>
							<li class="listitem"><p>
									Added support/bug hunting feature that generates
									<code class="filename">.sql</code>
									test scripts to
									<code class="literal">STDERR</code>
									when
									<code class="literal">autoGenerateTestcaseScript</code>
									is set to
									<code class="literal">true</code>
									. (Bug #10496)
								</p></li>
							<li class="listitem"><p>
									Driver detects if you're running MySQL-5.0.7 or later, and does
									not scan for
									<code class="literal">LIMIT ?[,?]</code>
									in statements being prepared, as the server supports those
									types of queries now. (Bug #10850)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">SQLException</code>
									is thrown when using property
									<code class="literal">characterSetResults</code>
									with
									<code class="literal">cp932</code>
									or
									<code class="literal">eucjpms</code>
									. (Bug #10496)
								</p></li>
							<li class="listitem"><p>Made JDBC2-compliant wrappers
									public to enable access to vendor extensions. (Bug #10155)</p></li>
							<li class="listitem"><p>
									Added the following configuration bundles, use one or many
									using the
									<code class="literal">useConfigs</code>
									configuration property:
								</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="literal">maxPerformance</code>
												: Maximum performance without being reckless
											</p></li>
										<li class="listitem"><p>
												<code class="literal">solarisMaxPerformance</code>
												: Maximum performance for Solaris, avoids syscalls where it
												can
											</p></li>
										<li class="listitem"><p>
												<code class="literal">3-0-Compat</code>
												: Compatibility with Connector/J 3.0.x functionality
											</p></li>
									</ul>
								</div>
								<p>(Bug #11115)</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.supportsMultipleOpenResults()</code>
									now returns
									<code class="literal">true</code>
									. The driver has supported this for some time, DBMD just missed
									that fact. (Bug #10155)
								</p></li>
							<li class="listitem"><p>
									Cleaned up logging of profiler events, moved code to dump a
									profiler event as a string to
									<code class="literal">com.mysql.jdbc.log.LogUtils</code>
									so that third parties can use it. (Bug #10155)
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">enableStreamingResults()</code>
									visible on
									<code class="literal">com.mysql.jdbc.jdbc2.optional.StatementWrapper</code>
									. (Bug #10155)
								</p></li>
							<li class="listitem"><p>Overhaul of character set
									configuration, everything now lives in a properties file.</p></li>
							<li class="listitem"><p>Driver now correctly uses CP932
									if available on the server for Windows-31J, CP932 and MS932
									java encoding names, otherwise it resorts to SJIS, which is
									only a close approximation. Currently only MySQL-5.0.3 and
									newer (and MySQL-4.1.12 or .13, depending on when the character
									set gets backported) can reliably support any variant of CP932.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-8"></a>A.3.8. Changes in MySQL Connector/J
									3.1.8 (2005-04-14)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added finalizers to
									<code class="literal">ResultSet</code>
									and
									<code class="literal">Statement</code>
									implementations to be JDBC spec-compliant, which requires that
									if not explicitly closed, these resources should be closed upon
									garbage collection. (Bug #9319)
								</p></li>
							<li class="listitem"><p>
									Should accept
									<code class="literal">null</code>
									for name patterns in DBMD (meaning <span class="quote">“<span
										class="quote"><code class="literal">%</code></span>”
									</span>), even though it isn't JDBC compliant, for legacy's sake.
									Disable by setting connection property
									<code class="literal">nullNamePatternMatchesAll</code>
									to
									<code class="literal">false</code>
									(which will be the default value in C/J 3.2.x). (Bug #9769)
								</p></li>
							<li class="listitem"><p>
									Check for empty strings (
									<code class="literal">''</code>
									) when converting <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">CHAR</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">VARCHAR</code></a> column
									data to numbers, throw exception if
									<code class="literal">emptyStringsConvertToZero</code>
									configuration property is set to
									<code class="literal">false</code>
									(for backward-compatibility with 3.0, it is now set to
									<code class="literal">true</code>
									by default, but will most likely default to
									<code class="literal">false</code>
									in 3.2). (Bug #8803)
								</p></li>
							<li class="listitem"><p>The performance metrics feature
									now gathers information about number of tables referenced in a
									SELECT. (Bug #9704)</p></li>
							<li class="listitem"><p>
									Fixed driver not returning
									<code class="literal">true</code>
									for
									<code class="literal">-1</code>
									when
									<code class="literal">ResultSet.getBoolean()</code>
									was called on result sets returned from server-side prepared
									statements. (Bug #9778)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerPreparedStatements</code>
									now correctly <span class="quote">“<span class="quote">stream</span>”
									</span> <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>/
									<code class="literal">CLOB</code>
									data to the server. You can configure the threshold chunk size
									using the JDBC URL property
									<code class="literal">blobSendChunkSize</code>
									(the default is 1MB). (Bug #8868)
								</p></li>
							<li class="listitem"><p>
									The logging system is now automatically configured. If the
									value has been set by the user, using the URL property
									<code class="literal">logger</code>
									or the system property
									<code class="literal">com.mysql.jdbc.logger</code>
									, then use that, otherwise, autodetect it using the following
									steps:
								</p>
								<div class="orderedlist">
									<ol class="orderedlist" type="1">
										<li class="listitem"><p>Log4j, if it is available,</p></li>
										<li class="listitem"><p>Then JDK1.4 logging,</p></li>
										<li class="listitem"><p>
												Then fallback to our
												<code class="literal">STDERR</code>
												logging.
											</p></li>
									</ol>
								</div>
								<p>(Bug #9704)</p></li>
							<li class="listitem"><p>
									Added a
									<code class="filename">Manifest.MF</code>
									file with implementation information to the
									<code class="filename">.jar</code>
									file. (Bug #9778)
								</p></li>
							<li class="listitem"><p>
									Should accept
									<code class="literal">null</code>
									for catalog (meaning use current) in DBMD methods, even though
									it is not JDBC-compliant for legacy's sake. Disable by setting
									connection property
									<code class="literal">nullCatalogMeansCurrent</code>
									to
									<code class="literal">false</code>
									(which will be the default value in C/J 3.2.x). (Bug #9917)
								</p></li>
							<li class="listitem"><p>
									More tests in
									<code class="literal">Field.isOpaqueBinary()</code>
									to distinguish opaque binary (that is, fields with type
									<code class="literal">CHAR(n)</code>
									and
									<code class="literal">CHARACTER SET BINARY</code>
									) from output of various scalar and aggregate functions that
									return strings. (Bug #9778)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getTables()</code>
									shouldn't return tables if views are asked for, even if the
									database version doesn't support views. (Bug #9778)
								</p></li>
							<li class="listitem"><p>
									Added support for the c3p0 connection pool's (<a class="ulink"
										href="http://c3p0.sf.net/" target="_top">http://c3p0.sf.net/</a>)
									validation/connection checker interface which uses the
									lightweight
									<code class="literal">COM_PING</code>
									call to the server if available. To use it, configure your c3p0
									connection pool's
									<code class="literal">connectionTesterClassName</code>
									property to use
									<code class="literal">com.mysql.jdbc.integration.c3p0.MysqlConnectionTester</code>
									. (Bug #9320)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DATA_TYPE</code>
									column from
									<code class="literal">DBMD.getBestRowIdentifier()</code>
									causes
									<code class="literal">ArrayIndexOutOfBoundsException</code>
									when accessed (and in fact, didn't return any value). (Bug
									#8803)
								</p></li>
							<li class="listitem"><p>
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format"
										target="_top"><code class="literal">DATE_FORMAT()</code></a>
									queries returned as <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>s from
									<code class="literal">getObject()</code>
									. (Bug #8868)
								</p></li>
							<li class="listitem"><p>
									A continuation of Bug #8868, where functions used in queries
									that should return nonstring types when resolved by temporary
									tables suddenly become opaque binary strings (work-around for
									server limitation). Also fixed fields with type of
									<code class="literal">CHAR(n) CHARACTER SET BINARY</code>
									to return correct/matching classes for
									<code class="literal">RSMD.getColumnClassName()</code>
									and
									<code class="literal">ResultSet.getObject()</code>
									. (Bug #9236)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.getMetaData()</code>
									inserts blank row in database under certain conditions when not
									using server-side prepared statements. (Bug #9320)
								</p></li>
							<li class="listitem"><p>
									Better detection of
									<code class="literal">LIMIT</code>
									inside/outside of quoted strings so that the driver can more
									correctly determine whether a prepared statement can be
									prepared on the server or not. (Bug #9320)
								</p></li>
							<li class="listitem"><p>
									Stored procedures with <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a>
									parameters with storage specifications that contained <span
										class="quote">“<span class="quote"><code
												class="literal">,</code></span>”
									</span> in them would fail. (Bug #9682)
								</p></li>
							<li class="listitem"><p>
									Server-side session variables can be preset at connection time
									by passing them as a comma-delimited list for the connection
									property
									<code class="literal">sessionVariables</code>
									. (Bug #8868)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.canHandleAsPreparedStatement()</code>
									now makes <span class="quote">“<span class="quote">best
											effort</span>”
									</span> to distinguish
									<code class="literal">LIMIT</code>
									clauses with placeholders in them from ones without to have
									fewer false positives when generating work-arounds for
									statements the server cannot currently handle as server-side
									prepared statements. (Bug #9320)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">BlobFromLocator</code>
									now uses correct identifier quoting when generating prepared
									statements. (Bug #8868)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Statement.getMoreResults()</code>
									could throw NPE when existing result set was
									<code class="literal">.close()</code>
									d. (Bug #9704)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.addBatch()</code>
									doesn't work with server-side prepared statements and streaming
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">BINARY</code></a> data.
									(Bug #9040)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="filename">build.xml</code>
									to not compile
									<code class="literal">log4j</code>
									logging if
									<code class="literal">log4j</code>
									not available. (Bug #9320)
								</p></li>
							<li class="listitem"><p>
									Cannot use
									<code class="literal">UTF-8</code>
									for characterSetResults configuration property. (Bug #9206)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.setObject(int,
										Object, int type, int scale)</code>
									now uses scale value for
									<code class="literal">BigDecimal</code>
									instances. (Bug #9682)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.supportsResultSetConcurrency()</code>
									not returning
									<code class="literal">true</code>
									for forward-only/read-only result sets (we obviously support
									this). (Bug #8792)
								</p></li>
							<li class="listitem"><p>
									Fixed regression in
									<code class="literal">ping()</code>
									for users using
									<code class="literal">autoReconnect=true</code>
									. (Bug #8868)
								</p></li>
							<li class="listitem"><p>Stored procedures with same name
									in different databases confuse the driver when it tries to
									determine parameter counts/types. (Bug #9319)</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.supportsMixedCase*Identifiers()</code>
									returns wrong value on servers running on case-sensitive file
									systems. (Bug #8800)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DatabaseMetaData.getTables()</code>
									returning views when they were not asked for as one of the
									requested table types.
								</p></li>
							<li class="listitem"><p>
									Added support for new precision-math <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a> type in
									MySQL 5.0.3 and up.
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">Connection.ping()</code>
									a public method.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.getTime()</code>
									on a
									<code class="literal">NULL</code>
									value for server-side prepared statements throws NPE.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-7"></a>A.3.9. Changes in MySQL Connector/J
									3.1.7 (2005-02-18)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Infinite recursion when <span class="quote">“<span
										class="quote">falling back</span>”
									</span> to master in failover configuration. (Bug #7952)
								</p></li>
							<li class="listitem"><p>Disable multi-statements (if
									enabled) for MySQL-4.1 versions prior to version 4.1.10 if the
									query cache is enabled, as the server returns wrong results in
									this configuration. (Bug #7952)</p></li>
							<li class="listitem"><p>
									Added support for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a> type in
									MySQL-5.0.3. The driver will treat
									<code class="literal">BIT(1-8)</code>
									as the JDBC standard <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a> type (which
									maps to
									<code class="literal">java.lang.Boolean</code>
									), as the server does not currently send enough information to
									determine the size of a bitfield when &lt; 9 bits are declared.
									<code class="literal">BIT(&gt;9)</code>
									will be treated as <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a>, and
									will return
									<code class="literal">byte[]</code>
									when
									<code class="literal">getObject()</code>
									is called. (Bug #8424)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">useLocalSessionState</code>
									configuration property, when set to
									<code class="literal">true</code>
									the JDBC driver trusts that the application is well-behaved and
									only sets autocommit and transaction isolation levels using the
									methods provided on
									<code class="literal">java.sql.Connection</code>
									, and therefore can manipulate these values in many cases
									without incurring round-trips to the database server. (Bug
									#8424)
								</p></li>
							<li class="listitem"><p>
									Fixed synchronization issue with
									<code class="literal">ServerPreparedStatement.serverPrepare()</code>
									that could cause deadlocks/crashes if connection was shared
									between threads. (Bug #8096)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">holdResultsOpenOverStatementClose</code>
									property (default is
									<code class="literal">false</code>
									), that keeps result sets open over statement.close() or new
									execution on same statement (suggested by Kevin Burton). (Bug
									#7715)
								</p></li>
							<li class="listitem"><p>
									Removed
									<code class="literal">dontUnpackBinaryResults</code>
									functionality, the driver now always stores results from
									server-side prepared statements as is from the server and
									unpacks them on demand. (Bug #7952)
								</p></li>
							<li class="listitem"><p>
									Detect new <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sql_mode"
										target="_top"><code class="literal">sql_mode</code></a>
									variable in string form (it used to be integer) and adjust
									quoting method for strings appropriately. (Bug #7715)
								</p></li>
							<li class="listitem"><p>
									Choose correct <span class="quote">“<span class="quote">direction</span>”
									</span> to apply time adjustments when both client and server are in
									GMT time zone when using
									<code class="literal">ResultSet.get(..., cal)</code>
									and
									<code class="literal">PreparedStatement.set(...., cal)</code>
									. (Bug #4718)
								</p></li>
							<li class="listitem"><p>
									Fixed duplicated code in
									<code class="literal">configureClientCharset()</code>
									that prevented
									<code class="literal">useOldUTF8Behavior=true</code>
									from working properly. (Bug #7952)
								</p></li>
							<li class="listitem"><p>
									Remove
									<code class="literal">_binary</code>
									introducer from parameters used as in/out parameters in
									<code class="literal">CallableStatement</code>
									. (Bug #4718)
								</p></li>
							<li class="listitem"><p>
									Always return
									<code class="literal">byte[]</code>
									s for output parameters registered as
									<code class="literal">*BINARY</code>
									. (Bug #4718)
								</p></li>
							<li class="listitem"><p>Timestamps converted incorrectly
									to strings with server-side prepared statements and updatable
									result sets. (Bug #7715)</p></li>
							<li class="listitem"><p>
									By default, the driver now scans SQL you are preparing using
									all variants of
									<code class="literal">Connection.prepareStatement()</code>
									to determine if it is a supported type of statement to prepare
									on the server side, and if it is not supported by the server,
									it instead prepares it as a client-side emulated prepared
									statement. You can disable this by passing
									<code class="literal">emulateUnsupportedPstmts=false</code>
									in your JDBC URL. (Bug #4718)
								</p></li>
							<li class="listitem"><p>Emulated locators corrupt binary
									data when using server-side prepared statements. (Bug #8096)</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">enableStreamingResults()</code>
									to
									<code class="literal">Statement</code>
									for connection pool implementations that check
									<code class="literal">Statement.setFetchSize()</code>
									for specification-compliant values. Call
									<code class="literal">Statement.setFetchSize(&gt;=0)</code>
									to disable the streaming results for that statement. (Bug
									#8424)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">dontTrackOpenResources</code>
									option (default is
									<code class="literal">false</code>
									, to be JDBC compliant), which helps with memory use for
									nonwell-behaved apps (that is, applications that don't close
									<code class="literal">Statement</code>
									objects when they should). (Bug #4718)
								</p></li>
							<li class="listitem"><p>
									Fixed NPE in
									<code class="literal">ResultSet.realClose()</code>
									when using usage advisor and result set was already closed.
									(Bug #8428)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getBigDecimal()</code>
									throws exception when rounding would need to occur to set
									scale. The driver now chooses a rounding mode of <span
										class="quote">“<span class="quote">half up</span>”
									</span> if nonrounding
									<code class="literal">BigDecimal.setScale()</code>
									fails. (Bug #8424)
								</p></li>
							<li class="listitem"><p>
									Send correct value for <span class="quote">“<span
										class="quote">boolean</span>”
									</span>
									<code class="literal">true</code>
									to server for
									<code class="literal">PreparedStatement.setObject(n,
										"true", Types.BIT)</code>
									. (Bug #4718)
								</p></li>
							<li class="listitem"><p>
									Timestamp key column data needed
									<code class="literal">_binary</code>
									stripped for
									<code class="literal">UpdatableResultSet.refreshRow()</code>
									. (Bug #7686)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatements</code>
									not creating streaming result sets. (Bug #8487)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getString()</code>
									doesn't maintain format stored on server, bug fix only enabled
									when
									<code class="literal">noDatetimeStringSync</code>
									property is set to
									<code class="literal">true</code>
									(the default is
									<code class="literal">false</code>
									). (Bug #8428)
								</p></li>
							<li class="listitem"><p>
									Fixed bug with Connection not caching statements from
									<code class="literal">prepareStatement()</code>
									when the statement wasn't a server-side prepared statement.
									(Bug #4718)
								</p></li>
							<li class="listitem"><p>
									Don't pass
									<code class="literal">NULL</code>
									to
									<code class="literal">String.valueOf()</code>
									in
									<code class="literal">ResultSet.getNativeConvertToString()</code>
									, as it stringifies it (that is, returns
									<code class="literal">null</code>
									), which is not correct for the method in question. (Bug #8487)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-6"></a>A.3.10. Changes in MySQL
									Connector/J 3.1.6 (2004-12-23)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">DBMD.getProcedures()</code>
									doesn't respect catalog parameter. (Bug #7026)
								</p></li>
							<li class="listitem"><p>
									Fixed hang on
									<code class="literal">SocketInputStream.read()</code>
									with
									<code class="literal">Statement.setMaxRows()</code>
									and multiple result sets when driver has to truncate result set
									directly, rather than tacking a
									<code class="literal">
										LIMIT <em class="replaceable"><code>n</code></em>
									</code>
									on the end of it.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-5"></a>A.3.11. Changes in MySQL
									Connector/J 3.1.5 (2004-12-02)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Removed unwanted new
									<code class="literal">Throwable()</code>
									in
									<code class="literal">ResultSet</code>
									constructor due to bad merge (caused a new object instance that
									was never used for every result set created). Found while
									profiling for Bug #6359. (Bug #6225)
								</p></li>
							<li class="listitem"><p>
									Use 1MB packet for sending file for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
										target="_top"><code class="literal">LOAD DATA LOCAL
											INFILE</code></a> if that is &lt; <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>
									on server. (Bug #6537)
								</p></li>
							<li class="listitem"><p>
									Use our own implementation of buffered input streams to get
									around blocking behavior of
									<code class="literal">java.io.BufferedInputStream</code>
									. Disable this with
									<code class="literal">useReadAheadInput=false</code>
									. (Bug #6399)
								</p></li>
							<li class="listitem"><p>
									Added experimental configuration property
									<code class="literal">dontUnpackBinaryResults</code>
									, which delays unpacking binary result set values until they're
									asked for, and only creates object instances for nonnumeric
									values (it is set to
									<code class="literal">false</code>
									by default). For some usecase/jvm combinations, this is
									friendlier on the garbage collector. (Bug #5706)
								</p></li>
							<li class="listitem"><p>
									Fixed batched updates with server prepared statements weren't
									looking if the types had changed for a given batched set of
									parameters compared to the previous set, causing the server to
									return the error <span class="quote">“<span
										class="quote">Wrong arguments to mysql_stmt_execute()</span>”
									</span>. (Bug #5235)
								</p></li>
							<li class="listitem"><p>
									Make auto-deserialization of
									<code class="literal">java.lang.Objects</code>
									stored in <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> columns
									configurable using
									<code class="literal">autoDeserialize</code>
									property (defaults to
									<code class="literal">false</code>
									). (Bug #6399)
								</p></li>
							<li class="listitem"><p>
									Don't throw exceptions for
									<code class="literal">Connection.releaseSavepoint()</code>
									. (Bug #5706)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerSidePreparedStatement</code>
									allocating short-lived objects unnecessarily. (Bug #6225)
								</p></li>
							<li class="listitem"><p>
									Inefficient detection of pre-existing string instances in
									<code class="literal">ResultSet.getNativeString()</code>
									. (Bug #5706)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">UNSIGNED BIGINT</code>
									unpacked incorrectly from server-side prepared statement result
									sets. (Bug #5729)
								</p></li>
							<li class="listitem"><p>Use null-safe-equals for key
									comparisons in updatable result sets. (Bug #6225)</p></li>
							<li class="listitem"><p>
									Failing to connect to the server when one of the addresses for
									the given host name is IPV6 (which the server does not yet bind
									on). The driver now loops through <span class="emphasis"><em>all</em></span>
									IP addresses for a given host, and stops on the first one that
									<code class="literal">accepts()</code>
									a
									<code class="literal">socket.connect()</code>
									. (Bug #6348)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSetMetaData.getColumnDisplaySize()</code>
									returns incorrect values for multi-byte charsets. (Bug #6399)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">SUM()</code>
									on <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a> with
									server-side prepared statement ignores scale if zero-padding is
									needed (this ends up being due to conversion to <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
										target="_top"><code class="literal">DOUBLE</code></a> by
									server, which when converted to a string to parse into
									<code class="literal">BigDecimal</code>
									, loses all <span class="quote">“<span class="quote">padding</span>”
									</span> zeros). (Bug #6537)
								</p></li>
							<li class="listitem"><p>
									Use a per-session
									<code class="literal">Calendar</code>
									instance by default when decoding dates from
									<code class="literal">ServerPreparedStatements</code>
									(set to old, less performant behavior by setting property
									<code class="literal">dynamicCalendars=true</code>
									). (Bug #5706)
								</p></li>
							<li class="listitem"><p>
									Handle case when string representation of timestamp contains
									trailing <span class="quote">“<span class="quote"><code
												class="literal">.</code></span>”
									</span> with no numbers following it. (Bug #5235)
								</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">DatabaseMetaData.getIdentifierQuoteString()</code>
									when building DBMD queries. (Bug #6537)
								</p></li>
							<li class="listitem"><p>
									Re-work
									<code class="literal">Field.isOpaqueBinary()</code>
									to detect
									<code class="literal">
										CHAR(<em class="replaceable"><code>n</code></em>) CHARACTER
										SET BINARY
									</code>
									to support fixed-length binary fields for
									<code class="literal">ResultSet.getObject()</code>
									. (Bug #6399)
								</p></li>
							<li class="listitem"><p>
									Server-side prepared statements did not honor
									<code class="literal">zeroDateTimeBehavior</code>
									property, and would cause class-cast exceptions when using
									<code class="literal">ResultSet.getObject()</code>
									, as the all-zero string was always returned. (Bug #5235)
								</p></li>
							<li class="listitem"><p>
									Fixed too-early creation of
									<code class="literal">StringBuffer</code>
									in
									<code class="literal">EscapeProcessor.escapeSQL()</code>
									, also return
									<code class="literal">String</code>
									when escaping not needed (to avoid unnecessary object
									allocations). Found while profiling for Bug #6359. (Bug #6225)
								</p></li>
							<li class="listitem"><p>
									Fix comparisons made between string constants and dynamic
									strings that are converted with either
									<code class="literal">toUpperCase()</code>
									or
									<code class="literal">toLowerCase()</code>
									to use
									<code class="literal">Locale.ENGLISH</code>
									, as some locales <span class="quote">“<span
										class="quote">override</span>”
									</span> case rules for English. Also use
									<code class="literal">StringUtils.indexOfIgnoreCase()</code>
									instead of
									<code class="literal">.toUpperCase().indexOf()</code>
									, avoids creating a very short-lived transient
									<code class="literal">String</code>
									instance.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-4"></a>A.3.12. Changes in MySQL
									Connector/J 3.1.4 (2004-09-04)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">ServerPreparedStatement</code>
									to read prepared statement metadata off the wire, even though
									it is currently a placeholder instead of using
									<code class="literal">MysqlIO.clearInputStream()</code>
									which didn't work at various times because data wasn't
									available to read from the server yet. This fixes sporadic
									errors users were having with
									<code class="literal">ServerPreparedStatements</code>
									throwing
									<code class="literal">ArrayIndexOutOfBoundExceptions</code>
									. (Bug #5032)
								</p></li>
							<li class="listitem"><p>
									Optimized integer number parsing, enable <span class="quote">“<span
										class="quote">old</span>”
									</span> slower integer parsing using JDK classes using
									<code class="literal">useFastIntParsing=false</code>
									property. (Bug #4642)
								</p></li>
							<li class="listitem"><p>
									Track packet sequence numbers if
									<code class="literal">enablePacketDebug=true</code>
									, and throw an exception if packets received out-of-order. (Bug
									#4689)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.wasNull()</code>
									does not work for primitives if a previous
									<code class="literal">null</code>
									was returned. (Bug #4689)
								</p></li>
							<li class="listitem"><p>
									Added three ways to deal with all-zero datetimes when reading
									them from a
									<code class="literal">ResultSet</code>
									:
									<code class="literal">exception</code>
									(the default), which throws an
									<code class="literal">SQLException</code>
									with an SQLState of
									<code class="literal">S1009</code>
									;
									<code class="literal">convertToNull</code>
									, which returns
									<code class="literal">NULL</code>
									instead of the date; and
									<code class="literal">round</code>
									, which rounds the date to the nearest closest value which is
									<code class="literal">'0001-01-01'</code>
									. (Bug #5032)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">useOnlyServerErrorMessages</code>
									property, which causes message text in exceptions generated by
									the server to only contain the text sent by the server (as
									opposed to the SQLState's <span class="quote">“<span
										class="quote">standard</span>”
									</span> description, followed by the server's error message). This
									property is set to
									<code class="literal">true</code>
									by default. (Bug #4642)
								</p></li>
							<li class="listitem"><p>
									The driver is more strict about truncation of numerics on
									<code class="literal">ResultSet.get*()</code>
									, and will throw an
									<code class="literal">SQLException</code>
									when truncation is detected. You can disable this by setting
									<code class="literal">jdbcCompliantTruncation</code>
									to
									<code class="literal">false</code>
									(it is enabled by default, as this functionality is required
									for JDBC compliance). (Bug #5032)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getObject()</code>
									returns wrong type for strings when using prepared statements.
									(Bug #4482)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerPreparedStatements</code>
									dealing with return of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">DECIMAL</code></a> type
									don't work. (Bug #5012)
								</p></li>
							<li class="listitem"><p>
									Calling
									<code class="literal">MysqlPooledConnection.close()</code>
									twice (even though an application error), caused NPE. Fixed.
									(Bug #4482)
								</p></li>
							<li class="listitem"><p>
									Connector/J 3.1.3 beta does not handle integers correctly
									(caused by changes to support unsigned reads in
									<code class="literal">Buffer.readInt()</code>
									-&gt;
									<code class="literal">Buffer.readShort()</code>
									). (Bug #4510)
								</p></li>
							<li class="listitem"><p>
									You can now use URLs in <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
										target="_top"><code class="literal">LOAD DATA LOCAL
											INFILE</code></a> statements, and the driver will use Java's built-in
									handlers for retrieving the data and sending it to the server.
									This feature is not enabled by default, you must set the
									<code class="literal">allowUrlInLocalInfile</code>
									connection property to
									<code class="literal">true</code>
									. (Bug #5032)
								</p></li>
							<li class="listitem"><p>
									Added support in
									<code class="literal">DatabaseMetaData.getTables()</code>
									and
									<code class="literal">getTableTypes()</code>
									for views, which are now available in MySQL server 5.0.x. (Bug
									#4510)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerPreparedStatement.execute*()</code>
									sometimes threw
									<code class="literal">ArrayIndexOutOfBoundsException</code>
									when unpacking field metadata. (Bug #4642)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getObject()</code>
									doesn't return type
									<code class="literal">Boolean</code>
									for pseudo-bit types from prepared statements on 4.1.x
									(shortcut for avoiding extra type conversion when using
									binary-encoded result sets obscured test in
									<code class="literal">getObject()</code>
									for <span class="quote">“<span class="quote">pseudo</span>”
									</span> bit type). (Bug #5032)
								</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">com.mysql.jdbc.Message</code>
									's classloader when loading resource bundle, should fix
									sporadic issues when the caller's classloader can't locate the
									resource bundle. (Bug #5032)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-3"></a>A.3.13. Changes in MySQL
									Connector/J 3.1.3 (2004-07-07)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Externalized more messages
									(on-going effort). (Bug #4119)</p></li>
							<li class="listitem"><p>
									Support new time zone variables in MySQL-4.1.3 when
									<code class="literal">useTimezone=true</code>
									. (Bug #4311)
								</p></li>
							<li class="listitem"><p>Null bitmask sent for
									server-side prepared statements was incorrect. (Bug #4119)</p></li>
							<li class="listitem"><p>
									Added constants for MySQL error numbers (publicly accessible,
									see
									<code class="literal">com.mysql.jdbc.MysqlErrorNumbers</code>
									), and the ability to generate the mappings of vendor error
									codes to SQLStates that the driver uses (for documentation
									purposes). (Bug #4119)
								</p></li>
							<li class="listitem"><p>
									Added packet debugging code (see the
									<code class="literal">enablePacketDebug</code>
									property documentation). (Bug #4119)
								</p></li>
							<li class="listitem"><p>
									Error in retrieval of
									<code class="literal">mediumint</code>
									column with prepared statements and binary protocol. (Bug
									#4311)
								</p></li>
							<li class="listitem"><p>
									Use SQL Standard SQL states by default, unless
									<code class="literal">useSqlStateCodes</code>
									property is set to
									<code class="literal">false</code>
									. (Bug #4119)
								</p></li>
							<li class="listitem"><p>
									Support for unsigned numerics as return types from prepared
									statements. This also causes a change in
									<code class="literal">ResultSet.getObject()</code>
									for the
									<code class="literal">bigint unsigned</code>
									type, which used to return
									<code class="literal">BigDecimal</code>
									instances, it now returns instances of
									<code class="literal">java.lang.BigInteger</code>
									. (Bug #4311)
								</p></li>
							<li class="listitem"><p>
									Added support for
									<code class="literal">INOUT</code>
									parameters in
									<code class="literal">CallableStatements</code>
									.
								</p></li>
							<li class="listitem"><p>
									Mangle output parameter names for
									<code class="literal">CallableStatements</code>
									so they will not clash with user variable names.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-2"></a>A.3.14. Changes in MySQL
									Connector/J 3.1.2 (2004-06-09)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">DatabaseMetaData.getProcedures()</code>
									when run on MySQL-5.0.0 (output of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-procedure-status.html"
										target="_top"><code class="literal">SHOW PROCEDURE
											STATUS</code></a> changed between 5.0.0 and 5.0.1. (Bug #3520)
								</p></li>
							<li class="listitem"><p>Fixed case when no output
									parameters specified for a stored procedure caused a bogus
									query to be issued to retrieve out parameters, leading to a
									syntax error from the server.</p></li>
							<li class="listitem"><p>
									Correctly map output parameters to position given in
									<code class="literal">prepareCall()</code>
									versus. order implied during
									<code class="literal">registerOutParameter()</code>
									. (Bug #3146)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">connectionCollation</code>
									property to cause driver to issue
									<code class="literal">set collation_connection=...</code>
									query on connection init if default collation for given charset
									is not appropriate. (Bug #3520)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ServerPreparedStatements</code>
									weren't actually de-allocating server-side resources when
									<code class="literal">.close()</code>
									was called.
								</p></li>
							<li class="listitem"><p>Don't enable server-side
									prepared statements for server version 5.0.0 or 5.0.1, as they
									aren't compatible with the '4.1.2+' style that the driver uses
									(the driver expects information to come back that isn't there,
									so it hangs). (Bug #3804)</p></li>
							<li class="listitem"><p>
									<code class="literal">getProcedures()</code>
									does not return any procedures in result set. (Bug #3539)
								</p></li>
							<li class="listitem"><p>
									Fixed stored procedure parameter parsing info when size was
									specified for a parameter (for example,
									<code class="literal">char()</code>
									,
									<code class="literal">varchar()</code>
									).
								</p></li>
							<li class="listitem"><p>
									Removed wrapping of exceptions in
									<code class="literal">MysqlIO.changeUser()</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getWarnings()</code>
									returns
									<code class="literal">SQLWarning</code>
									instead of
									<code class="literal">DataTruncation</code>
									. (Bug #3804)
								</p></li>
							<li class="listitem"><p>Cleaned up detection of server
									properties. (Bug #3146)</p></li>
							<li class="listitem"><p>Correctly detect initial
									character set for servers &gt;= 4.1.0. (Bug #3146)</p></li>
							<li class="listitem"><p>Support placeholder for
									parameter metadata for server &gt;= 4.1.2. (Bug #3146)</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">logSlowQueries</code>
									property, along with
									<code class="literal">slowQueriesThresholdMillis</code>
									property to control when a query should be considered <span
										class="quote">“<span class="quote">slow.</span>”
									</span>
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">.toString()</code>
									functionality to
									<code class="literal">ServerPreparedStatement</code>
									, which should help if you're trying to debug a query that is a
									prepared statement (it shows SQL as the server would process).
								</p></li>
							<li class="listitem"><p>Fixed sending of split packets
									for large queries, enabled nio ability to send large packets as
									well.</p></li>
							<li class="listitem"><p>
									Enabled callable statement caching using
									<code class="literal">cacheCallableStmts</code>
									property.
								</p></li>
							<li class="listitem"><p>
									Fixed case when no parameters could cause a
									<code class="literal">NullPointerException</code>
									in
									<code class="literal">CallableStatement.setOutputParameters()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">gatherPerformanceMetrics</code>
									property, along with properties to control when/where this info
									gets logged (see docs for more info).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getSQLStateType()</code>
									returns incorrect value. (Bug #3520)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getProcedureColumns()</code>
									doesn't work with wildcards for procedure name. (Bug #3540)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-1"></a>A.3.15. Changes in MySQL
									Connector/J 3.1.1 (2004-02-14, alpha)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed charset conversion issue in
									<code class="literal">getTables()</code>
									. (Bug #2502)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ConnectionProperties</code>
									that weren't properly exposed through accessors, cleaned up
									<code class="literal">ConnectionProperties</code>
									code. (Bug #2623)
								</p></li>
							<li class="listitem"><p>
									Prepared
									<code class="literal">Statements</code>
									will be re-prepared on auto-reconnect. Any errors encountered
									are postponed until first attempt to re-execute the re-prepared
									statement.
								</p></li>
							<li class="listitem"><p>Reduced number of methods called
									in average query to be more efficient.</p></li>
							<li class="listitem"><p>
									Refactored how connection properties are set and exposed as
									<code class="literal">DriverPropertyInfo</code>
									as well as
									<code class="literal">Connection</code>
									and
									<code class="literal">DataSource</code>
									properties.
								</p></li>
							<li class="listitem"><p>
									Fixed stack overflow in
									<code class="literal">Connection.prepareCall()</code>
									(bad merge).
								</p></li>
							<li class="listitem"><p>Enabled streaming of result sets
									from server-side prepared statements. (Bug #2606)</p></li>
							<li class="listitem"><p>
									Allow contents of
									<code class="literal">PreparedStatement.setBlob()</code>
									to be retained between calls to
									<code class="literal">.execute*()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">IllegalAccessError</code>
									to
									<code class="literal">Calendar.getTimeInMillis()</code>
									in
									<code class="literal">DateTimeValue</code>
									(for JDK &lt; 1.4).
								</p></li>
							<li class="listitem"><p>
									Default result set type changed to
									<code class="literal">TYPE_FORWARD_ONLY</code>
									(JDBC compliance).
								</p></li>
							<li class="listitem"><p>
									Fixed bug with
									<code class="literal">UpdatableResultSets</code>
									not using client-side prepared statements.
								</p></li>
							<li class="listitem"><p>Class-cast exception when using
									scrolling result sets and server-side prepared statements. (Bug
									#2623)</p></li>
							<li class="listitem"><p>Display where/why a connection
									was implicitly closed (to aid debugging). (Bug #1673)</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									is not returning correct column ordinal info for non-
									<code class="literal">'%'</code>
									column name patterns. (Bug #1673)
								</p></li>
							<li class="listitem"><p>Centralized setting of result
									set type and concurrency.</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Connection.prepareCall()</code>
									, and
									<code class="literal">DatabaseMetaData</code>
									.
									<code class="literal">getProcedures()</code>
									and
									<code class="literal">getProcedureColumns()</code>
									. (Bug #2359)
								</p></li>
							<li class="listitem"><p>Implemented multiple result sets
									returned from a statement or stored procedure. (Bug #2502)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">NullPointerException</code>
									in
									<code class="literal">ServerPreparedStatement.setTimestamp()</code>
									, as well as year and month discrepencies in
									<code class="literal">ServerPreparedStatement.setTimestamp()</code>
									,
									<code class="literal">setDate()</code>
									. (Bug #1673)
								</p></li>
							<li class="listitem"><p>Fixed character encoding issues
									when converting bytes to ASCII when MySQL doesn't provide the
									character set, and the JVM is set to a multi-byte encoding
									(usually affecting retrieval of numeric values).</p></li>
							<li class="listitem"><p>
									Support <span class="quote">“<span class="quote">old</span>”
									</span>
									<code class="literal">profileSql</code>
									capitalization in
									<code class="literal">ConnectionProperties</code>
									. This property is deprecated, you should use
									<code class="literal">profileSQL</code>
									if possible.
								</p></li>
							<li class="listitem"><p>
									Added ability to have multiple database/JVM targets for
									compliance and regression/unit tests in
									<code class="filename">build.xml</code>
									. (Bug #1673)
								</p></li>
							<li class="listitem"><p>Support for transaction
									savepoints (MySQL &gt;= 4.0.14 or 4.1.1).</p></li>
							<li class="listitem"><p>
									Check for closed connection on delete/update/insert row
									operations in
									<code class="literal">UpdatableResultSet</code>
									.
								</p></li>
							<li class="listitem"><p>
									Support for NIO. Use
									<code class="literal">useNIO=true</code>
									on platforms that support NIO.
								</p></li>
							<li class="listitem"><p>Fixed sending of queries larger
									than 16M. (Bug #1673)</p></li>
							<li class="listitem"><p>Use DocBook version of docs for
									shipped versions of drivers. (Bug #2671)</p></li>
							<li class="listitem"><p>
									Merged fix of data type mapping from MySQL type <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
										target="_top"><code class="literal">FLOAT</code></a> to
									<code class="literal">java.sql.Types.REAL</code>
									from 3.0 branch. (Bug #1673)
								</p></li>
							<li class="listitem"><p>
									Merged prepared statement caching, and
									<code class="literal">.getMetaData()</code>
									support from 3.0 branch. (Bug #2359)
								</p></li>
							<li class="listitem"><p>
									Fixed NPE and year/month bad conversions when accessing some
									datetime functionality in
									<code class="literal">ServerPreparedStatements</code>
									and their resultant result sets. (Bug #1673)
								</p></li>
							<li class="listitem"><p>
									Removed
									<code class="literal">useFastDates</code>
									connection property.
								</p></li>
							<li class="listitem"><p>
									Added named and indexed input/output parameter support to
									<code class="literal">CallableStatement</code>
									. MySQL-5.0.x or newer. (Bug #1673)
								</p></li>
							<li class="listitem"><p>
									Fixed off-by-1900 error in some cases for years in
									<code class="literal">TimeUtil.fastDate</code>
									/
									<code class="literal">TimeCreate()</code>
									when unpacking results from server-side prepared statements.
									(Bug #2359)
								</p></li>
							<li class="listitem"><p>
									Support for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/mysql-change-user.html"
										target="_top"><code class="literal">mysql_change_user()</code></a>.
									See the
									<code class="literal">changeUser()</code>
									method in
									<code class="literal">com.mysql.jdbc.Connection</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData</code>
									now reports
									<code class="literal">supportsStoredProcedures()</code>
									for MySQL versions &gt;= 5.0.0
								</p></li>
							<li class="listitem"><p>
									Deal with 0-length tokens in
									<code class="literal">EscapeProcessor</code>
									(caused by callable statement escape syntax).
								</p></li>
							<li class="listitem"><p>
									Reset
									<code class="literal">long binary</code>
									parameters in
									<code class="literal">ServerPreparedStatement</code>
									when
									<code class="literal">clearParameters()</code>
									is called, by sending
									<code class="literal">COM_RESET_STMT</code>
									to the server. (Bug #2359)
								</p></li>
							<li class="listitem"><p>
									Server-side prepared statements were not returning data type <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/year.html"
										target="_top"><code class="literal">YEAR</code></a> correctly.
									(Bug #2606)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">NULL</code>
									fields were not being encoded correctly in all cases in
									server-side prepared statements. (Bug #2671)
								</p></li>
							<li class="listitem"><p>Implemented long data (Blobs,
									Clobs, InputStreams, Readers) for server prepared statements.</p></li>
							<li class="listitem"><p>Correctly initialize datasource
									properties from JNDI Refs, including explicitly specified URLs.
								</p></li>
							<li class="listitem"><p>Ensure that warnings are cleared
									before executing queries on prepared statements, as-per JDBC
									spec (now that we support warnings).</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Statement.getWarnings()</code>
									for MySQL-4.1 and newer (using <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html"
										target="_top"><code class="literal">SHOW WARNINGS</code></a>).
								</p></li>
							<li class="listitem"><p>
									Unpack <span class="quote">“<span class="quote">unknown</span>”
									</span> data types from server prepared statements as
									<code class="literal">Strings</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">NULL</code>
									values for numeric types in binary encoded result sets causing
									<code class="literal">NullPointerExceptions</code>
									. (Bug #2359)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">CommunicationsException</code>
									implemented, that tries to determine why communications was
									lost with a server, and displays possible reasons when
									<code class="literal">.getMessage()</code>
									is called. (Bug #1673)
								</p></li>
							<li class="listitem"><p>Fixed rare buffer underflow when
									writing numbers into buffers for sending prepared statement
									execution requests. (Bug #2671)</p></li>
							<li class="listitem"><p>
									Fix support for table aliases when checking for all primary
									keys in
									<code class="literal">UpdatableResultSet</code>
									.
								</p></li>
							<li class="listitem"><p>
									Optimized
									<code class="literal">Buffer.readLenByteArray()</code>
									to return shared empty byte array when length is 0.
								</p></li>
							<li class="listitem"><p>
									Detect collation of column for
									<code class="literal">RSMD.isCaseSensitive()</code>
									. (Bug #1673)
								</p></li>
							<li class="listitem"><p>Merged unbuffered input code
									from 3.0. (Bug #2623)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-1-0"></a>A.3.16. Changes in MySQL
									Connector/J 3.1.0 (2003-02-18, alpha)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Track open
									<code class="literal">Statements</code>
									, close all when
									<code class="literal">Connection.close()</code>
									is called (JDBC compliance).
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">requireSSL</code>
									property.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">useServerPrepStmts</code>
									property (default
									<code class="literal">false</code>
									). The driver will use server-side prepared statements when the
									server version supports them (4.1 and newer) when this property
									is set to
									<code class="literal">true</code>
									. It is currently set to
									<code class="literal">false</code>
									by default until all bind/fetch functionality has been
									implemented. Currently only DML prepared statements are
									implemented for 4.1 server-side prepared statements.
								</p></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-3-0-x"></a>A.4. Changes in MySQL Connector/J
								3.0.x
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-3-0-17">A.4.1.
									Changes in MySQL Connector/J 3.0.17 (2005-06-23)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-16">A.4.2.
									Changes in MySQL Connector/J 3.0.16 (2004-11-15)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-15">A.4.3.
									Changes in MySQL Connector/J 3.0.15 (2004-09-04)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-14">A.4.4.
									Changes in MySQL Connector/J 3.0.14 (2004-05-28)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-13">A.4.5.
									Changes in MySQL Connector/J 3.0.13 (2004-05-27)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-12">A.4.6.
									Changes in MySQL Connector/J 3.0.12 (2004-05-18)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-11">A.4.7.
									Changes in MySQL Connector/J 3.0.11 (2004-02-19)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-10">A.4.8.
									Changes in MySQL Connector/J 3.0.10 (2004-01-13)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-9">A.4.9.
									Changes in MySQL Connector/J 3.0.9 (2003-10-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-8">A.4.10.
									Changes in MySQL Connector/J 3.0.8 (2003-05-23)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-7">A.4.11.
									Changes in MySQL Connector/J 3.0.7 (2003-04-08)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-6">A.4.12.
									Changes in MySQL Connector/J 3.0.6 (2003-02-18)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-5">A.4.13.
									Changes in MySQL Connector/J 3.0.5 (2003-01-22)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-4">A.4.14.
									Changes in MySQL Connector/J 3.0.4 (2003-01-06)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-3">A.4.15.
									Changes in MySQL Connector/J 3.0.3 (2002-12-17)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-2">A.4.16.
									Changes in MySQL Connector/J 3.0.2 (2002-11-08)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-1">A.4.17.
									Changes in MySQL Connector/J 3.0.1 (2002-09-21)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-3-0-0">A.4.18.
									Changes in MySQL Connector/J 3.0.0 (2002-07-31)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-17"></a>A.4.1. Changes in MySQL
									Connector/J 3.0.17 (2005-06-23)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.fixDecimalExponent()</code>
									adding extra
									<code class="literal">+</code>
									, making number unparseable by MySQL server. (Bug #7061)
								</p></li>
							<li class="listitem"><p>
									Workaround for server Bug #9098: Default values of
									<code class="literal">CURRENT_*</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATE</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/time.html"
										target="_top"><code class="literal">TIME</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATETIME</code></a>, and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a>
									columns can't be distinguished from
									<code class="literal">string</code>
									values, so
									<code class="literal">UpdatableResultSet.moveToInsertRow()</code>
									generates bad SQL for inserting default values. (Bug #8812)
								</p></li>
							<li class="listitem"><p>Handle streaming result sets
									with more than 2 billion rows properly by fixing wraparound of
									row number counter. (Bug #7601)</p></li>
							<li class="listitem"><p>
									Fixed duplicated code in
									<code class="literal">configureClientCharset()</code>
									that prevented
									<code class="literal">useOldUTF8Behavior=true</code>
									from working properly. (Bug #7952)
								</p></li>
							<li class="listitem"><p>
									Statements created from a pooled connection were returning
									physical connection instead of logical connection when
									<code class="literal">getConnection()</code>
									was called. (Bug #7316)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">MS932</code>
									,
									<code class="literal">SHIFT_JIS</code>
									, and
									<code class="literal">Windows_31J</code>
									not recognized as aliases for
									<code class="literal">sjis</code>
									. (Bug #7607)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">EUCKR</code>
									charset is sent as
									<code class="literal">SET NAMES euc_kr</code>
									which MySQL-4.1 and newer doesn't understand. (Bug #8629)
								</p></li>
							<li class="listitem"><p>
									Support new protocol type
									<code class="literal">MYSQL_TYPE_VARCHAR</code>
									. (Bug #7081)
								</p></li>
							<li class="listitem"><p>Connections starting up
									failed-over (due to down master) never retry master. (Bug
									#6966)</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatements</code>
									don't encode Big5 (and other multi-byte) character sets
									correctly in static SQL strings. (Bug #7033)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.fixDecimalExponent()</code>
									adding extra
									<code class="literal">+</code>
									, making number unparseable by MySQL server. (Bug #7601)
								</p></li>
							<li class="listitem"><p>
									Backported SQLState codes mapping from Connector/J 3.1, enable
									with
									<code class="literal">useSqlStateCodes=true</code>
									as a connection property, it defaults to
									<code class="literal">false</code>
									in this release, so that we don't break legacy applications (it
									defaults to
									<code class="literal">true</code>
									starting with Connector/J 3.1). (Bug #7686)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">useOldUTF8Behavior</code>
									' configuration property, which causes JDBC driver to act like
									it did with MySQL-4.0.x and earlier when the character encoding
									is
									<code class="literal">utf-8</code>
									when connected to MySQL-4.1 or newer. (Bug #7081)
								</p></li>
							<li class="listitem"><p>
									Escape sequence {fn convert(..., type)} now supports ODBC-style
									types that are prepended by
									<code class="literal">SQL_</code>
									. (Bug #7601)
								</p></li>
							<li class="listitem"><p>
									Added support for the
									<code class="literal">EUC_JP_Solaris</code>
									character encoding, which maps to a MySQL encoding of
									<code class="literal">eucjpms</code>
									(backported from 3.1 branch). This only works on servers that
									support
									<code class="literal">eucjpms</code>
									, namely 5.0.3 or later. (Bug #8629)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">NON_UNIQUE</code>
									column from
									<code class="literal">DBMD.getIndexInfo()</code>
									returned inverted value. (Bug #8812)
								</p></li>
							<li class="listitem"><p>
									Use hex escapes for
									<code class="literal">PreparedStatement.setBytes()</code>
									for double-byte charsets including <span class="quote">“<span
										class="quote">aliases</span>”
									</span>
									<code class="literal">Windows-31J</code>
									,
									<code class="literal">CP934</code>
									,
									<code class="literal">MS932</code>
									. (Bug #8629)
								</p></li>
							<li class="listitem"><p>
									Timestamp key column data needed
									<code class="literal">_binary</code>
									stripped for
									<code class="literal">UpdatableResultSet.refreshRow()</code>
									. (Bug #7686)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getIndexInfo()</code>
									ignored
									<code class="literal">unique</code>
									parameter. (Bug #7081)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.supportsSelectForUpdate()</code>
									returns correct value based on server version. (Bug #8629)
								</p></li>
							<li class="listitem"><p>Which requires hex escaping of
									binary data when using multi-byte charsets with prepared
									statements. (Bug #8064)</p></li>
							<li class="listitem"><p>
									<code class="literal">Timestamp</code>
									/
									<code class="literal">Time</code>
									conversion goes in the wrong <span class="quote">“<span
										class="quote">direction</span>”
									</span> when
									<code class="literal">useTimeZone=true</code>
									and server time zone differs from client time zone. (Bug #5874)
								</p></li>
							<li class="listitem"><p>
									Adding
									<code class="literal">CP943</code>
									to aliases for
									<code class="literal">sjis</code>
									. (Bug #6549, Bug #7607)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-16"></a>A.4.2. Changes in MySQL
									Connector/J 3.0.16 (2004-11-15)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Made
									<code class="literal">TINYINT(1)</code>
									-&gt; <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a>/
									<code class="literal">Boolean</code>
									conversion configurable using
									<code class="literal">tinyInt1isBit</code>
									property (default
									<code class="literal">true</code>
									to be JDBC compliant out of the box). (Bug #5664)
								</p></li>
							<li class="listitem"><p>
									Off-by-one bug in
									<code class="literal">
										Buffer.readString(<em class="replaceable"><code>string</code></em>)
									</code>
									. (Bug #5664)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.updateByte()</code>
									when on insert row throws
									<code class="literal">ArrayOutOfBoundsException</code>
									. (Bug #5664)
								</p></li>
							<li class="listitem"><p>
									Fixed regression where
									<code class="literal">useUnbufferedInput</code>
									was defaulting to
									<code class="literal">false</code>
									. (Bug #5664)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getTimestamp()</code>
									on a column with <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/time.html"
										target="_top"><code class="literal">TIME</code></a> in it
									fails. (Bug #5664)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DatabaseMetaData.getTypes()</code>
									returning incorrect (this is, nonnegative) scale for the <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html"
										target="_top"><code class="literal">NUMERIC</code></a> type.
									(Bug #5664)
								</p></li>
							<li class="listitem"><p>
									Only set <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_character_set_results"
										target="_top"><code class="literal">character_set_results</code></a>
									during connection establishment if server version &gt;= 4.1.1.
									(Bug #5664)
								</p></li>
							<li class="listitem"><p>
									Re-issue character set configuration commands when re-using
									pooled connections or
									<code class="literal">Connection.changeUser()</code>
									when connected to MySQL-4.1 or newer.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.isReadOnly()</code>
									to detect nonwritable columns when connected to MySQL-4.1 or
									newer, based on existence of <span class="quote">“<span
										class="quote">original</span>”
									</span> table and column names.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-15"></a>A.4.3. Changes in MySQL
									Connector/J 3.0.15 (2004-09-04)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Calling
									<code class="literal">.close()</code>
									twice on a
									<code class="literal">PooledConnection</code>
									causes NPE. (Bug #4808)
								</p></li>
							<li class="listitem"><p>
									<span class="quote">“<span class="quote">Production</span>”
									</span> is now <span class="quote">“<span class="quote">GA</span>”
									</span> (General Availability) in naming scheme of distributions. (Bug
									#4860, Bug #4138)
								</p></li>
							<li class="listitem"><p>
									<a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
										target="_top"><code class="literal">DOUBLE</code></a> mapped
									twice in
									<code class="literal">DBMD.getTypeInfo()</code>
									. (Bug #4742)
								</p></li>
							<li class="listitem"><p>
									Removed redundant calls to
									<code class="literal">checkRowPos()</code>
									in
									<code class="literal">ResultSet</code>
									. (Bug #4334)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getColumns()</code>
									returns incorrect JDBC type for unsigned columns. This affects
									type mappings for all numeric types in the
									<code class="literal">RSMD.getColumnType()</code>
									and
									<code class="literal">RSMD.getColumnTypeNames()</code>
									methods as well, to ensure that <span class="quote">“<span
										class="quote">like</span>”
									</span> types from
									<code class="literal">DBMD.getColumns()</code>
									match up with what
									<code class="literal">RSMD.getColumnType()</code>
									and
									<code class="literal">getColumnTypeNames()</code>
									return. (Bug #4860, Bug #4138)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getMetaData()</code>
									should not return incorrectly initialized metadata if the
									result set has been closed, but should instead throw an
									<code class="literal">SQLException</code>
									. Also fixed for
									<code class="literal">getRow()</code>
									and
									<code class="literal">getWarnings()</code>
									and traversal methods by calling
									<code class="literal">checkClosed()</code>
									before operating on instance-level fields that are nullified
									during
									<code class="literal">.close()</code>
									. (Bug #5069)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">RSMD.getPrecision()</code>
									returning 0 for nonnumeric types (should return max length in
									chars for nonbinary types, max length in bytes for binary
									types). This fix also fixes mapping of
									<code class="literal">RSMD.getColumnType()</code>
									and
									<code class="literal">RSMD.getColumnTypeName()</code>
									for the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> types
									based on the length sent from the server (the server doesn't
									distinguish between <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TINYBLOB</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">MEDIUMBLOB</code></a> or <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">LONGBLOB</code></a> at the
									network protocol level). (Bug #4880)
								</p></li>
							<li class="listitem"><p>Added FLOSS license exemption.
									(Bug #4742)</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet</code>
									should release
									<code class="literal">Field[]</code>
									instance in
									<code class="literal">.close()</code>
									. (Bug #5022)
								</p></li>
							<li class="listitem"><p>
									Failover for
									<code class="literal">autoReconnect</code>
									not using port numbers for any hosts, and not retrying all
									hosts.
								</p>
								<div xmlns="http://www.w3.org/1999/xhtml" class="warning"
									style="margin-left: 0.5in; margin-right: 0.5in;">
									<div class="admon-title">Warning</div>
									<p xmlns="">
										This required a change to the
										<code class="literal">SocketFactory</code>
										<code class="literal">connect()</code>
										method signature, which is now
										<code class="literal">public Socket connect(String
											host, int portNumber, Properties props)</code>
										; therefore, any third-party socket factories will have to be
										changed to support this signature.
									</p>
								</div>
								<p>(Bug #4334)</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">_binary</code>
									introducer for
									<code class="literal">PreparedStatement.setBytes()</code>
									and
									<code class="literal">set*Stream()</code>
									when connected to MySQL-4.1.x or newer to avoid
									misinterpretation during character conversion. (Bug #5069)
								</p></li>
							<li class="listitem"><p>
									Logical connections created by
									<code class="literal">MysqlConnectionPoolDataSource</code>
									will now issue a
									<code class="literal">rollback()</code>
									when they are closed and sent back to the pool. If your
									application server/connection pool already does this for you,
									you can set the
									<code class="literal">rollbackOnPooledClose</code>
									property to
									<code class="literal">false</code>
									to avoid the overhead of an extra
									<code class="literal">rollback()</code>
									. (Bug #4334)
								</p></li>
							<li class="listitem"><p>Parse new time zone variables
									from 4.1.x servers. (Bug #5069)</p></li>
							<li class="listitem"><p>
									<code class="literal">StringUtils.escapeEasternUnicodeByteStream</code>
									was still broken for GBK. (Bug #4010)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-14"></a>A.4.4. Changes in MySQL
									Connector/J 3.0.14 (2004-05-28)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed URL parsing error.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-13"></a>A.4.5. Changes in MySQL
									Connector/J 3.0.13 (2004-05-27)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Using a
									<code class="literal">MySQLDatasource</code>
									without server name fails. (Bug #3848)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.getGeneratedKeys()</code>
									method returns only 1 result for batched insertions. (Bug
									#3873)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">No Database Selected</code>
									when using
									<code class="literal">MysqlConnectionPoolDataSource</code>
									. (Bug #3920)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-12"></a>A.4.6. Changes in MySQL
									Connector/J 3.0.12 (2004-05-18)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Backported <span class="quote">“<span class="quote">change
											user</span>”
									</span> and <span class="quote">“<span class="quote">reset
											server state</span>”
									</span> functionality from 3.1 branch, to enable clients of
									<code class="literal">MysqlConnectionPoolDataSource</code>
									to reset server state on
									<code class="literal">getConnection()</code>
									on a pooled connection.
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">StringRegressionTest</code>
									4.1-unicode aware. (Bug #3520)
								</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">SET character_set_results</code>
									during initialization to enable any charset to be returned to
									the driver for result sets. (Bug #2670)
								</p></li>
							<li class="listitem"><p>
									Fixed regression in
									<code class="literal">PreparedStatement.setString()</code>
									and eastern character encodings. (Bug #3520)
								</p></li>
							<li class="listitem"><p>
									Don't truncate
									<code class="literal">BLOB</code>
									or
									<code class="literal">CLOB</code>
									values when using
									<code class="literal">setBytes()</code>
									and
									<code class="literal">setBinary/CharacterStream()</code>
									. (Bug #2670)
								</p></li>
							<li class="listitem"><p>
									Map duplicate key and foreign key errors to SQLState of
									<code class="literal">23000</code>
									.
								</p></li>
							<li class="listitem"><p>
									Allow
									<code class="literal">java.util.Date</code>
									to be sent in as parameter to
									<code class="literal">PreparedStatement.setObject()</code>
									, converting it to a
									<code class="literal">Timestamp</code>
									to maintain full precision. . (Bug #103)
								</p></li>
							<li class="listitem"><p>
									Add unsigned attribute to
									<code class="literal">DatabaseMetaData.getColumns()</code>
									output in the
									<code class="literal">TYPE_NAME</code>
									column.
								</p></li>
							<li class="listitem"><p>
									Not specifying database in URL caused
									<code class="literal">MalformedURL</code>
									exception. (Bug #3554)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">failOverReadOnly</code>
									property, to enable the user to configure the state of the
									connection (read-only/writable) when failed over.
								</p></li>
							<li class="listitem"><p>
									Dynamically configure character set mappings for field-level
									character sets on MySQL-4.1.0 and newer using <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-collation.html"
										target="_top"><code class="literal">SHOW COLLATION</code></a>
									when connecting. (Bug #2670)
								</p></li>
							<li class="listitem"><p>
									Map
									<code class="literal">binary</code>
									character set to
									<code class="literal">US-ASCII</code>
									to support <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATETIME</code></a>
									charset recognition for servers &gt;= 4.1.2. (Bug #2670)
								</p></li>
							<li class="listitem"><p>Inconsistent reporting of data
									type. The server still doesn't return all types for *BLOBs
									*TEXT correctly, so the driver won't return those correctly.
									(Bug #3570)</p></li>
							<li class="listitem"><p>
									Auto-convert MySQL encoding names to Java encoding names if
									used for
									<code class="literal">characterEncoding</code>
									property. (Bug #3554)
								</p></li>
							<li class="listitem"><p>Backport documentation tooling
									from 3.1 branch.</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">junit.textui.TestRunner</code>
									for all unit tests (to enable them to be run from the command
									line outside of Ant or Eclipse). (Bug #3554)
								</p></li>
							<li class="listitem"><p>
									Renamed
									<code class="literal">StringUtils.escapeSJISByteStream()</code>
									to more appropriate
									<code class="literal">escapeEasternUnicodeByteStream()</code>
									. (Bug #3511)
								</p></li>
							<li class="listitem"><p>
									Use
									<code class="literal">charsetnr</code>
									returned during connect to encode queries before issuing
									<code class="literal">SET NAMES</code>
									on MySQL &gt;= 4.1.0. (Bug #2670)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">StringUtils.escapeSJISByteStream()</code>
									not covering all eastern double-byte charsets correctly. (Bug
									#3511)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getSQLStateType()</code>
									returns incorrect value. (Bug #3520)
								</p></li>
							<li class="listitem"><p>
									Add helper methods to
									<code class="literal">ResultSetMetaData</code>
									(
									<code class="literal">getColumnCharacterEncoding()</code>
									and
									<code class="literal">getColumnCharacterSet()</code>
									) to permit end users to see what charset the driver thinks it
									should be using for the column. (Bug #2670)
								</p></li>
							<li class="listitem"><p>Don't escape SJIS/GBK/BIG5 when
									using MySQL-4.1 or newer.</p></li>
							<li class="listitem"><p>Added encoding names that are
									recognized on some JVMs to fix case where they were
									reverse-mapped to MySQL encoding names incorrectly. (Bug #3554)</p></li>
							<li class="listitem"><p>
									Only set <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_character_set_results"
										target="_top"><code class="literal">character_set_results</code></a>
									for MySQL &gt;= 4.1.0. (Bug #2670)
								</p></li>
							<li class="listitem"><p>
									Return creating statement for
									<code class="literal">ResultSets</code>
									created by
									<code class="literal">getGeneratedKeys()</code>
									. (Bug #2957)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">UpdatableResultSet</code>
									not picking up default values for
									<code class="literal">moveToInsertRow()</code>
									. (Bug #3557)
								</p></li>
							<li class="listitem"><p>
									Allow
									<code class="literal">url</code>
									parameter for
									<code class="literal">MysqlDataSource</code>
									and
									<code class="literal">MysqlConnectionPool</code>
									<code class="literal">DataSource</code>
									so that passing of other properties is possible from inside
									appservers.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-11"></a>A.4.7. Changes in MySQL
									Connector/J 3.0.11 (2004-02-19)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Return
									<code class="literal">java.lang.Integer</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">TINYINT</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">SMALLINT</code></a> types
									from
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									. (Bug #2852)
								</p></li>
							<li class="listitem"><p>
									Return
									<code class="literal">java.lang.Double</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html"
										target="_top"><code class="literal">FLOAT</code></a> type from
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									. (Bug #2855)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">useUnbufferedInput</code>
									parameter, and now use it by default (due to JVM issue <a
										class="ulink"
										href="http://developer.java.sun.com/developer/bugParade/bugs/4401235.html"
										target="_top">http://developer.java.sun.com/developer/bugParade/bugs/4401235.html</a>)
									(Bug #2578)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">AutoReconnect</code>
									time was growing faster than exponentially. (Bug #2447)
								</p></li>
							<li class="listitem"><p>Fixed failover always going to
									last host in list. (Bug #2578)</p></li>
							<li class="listitem"><p>
									Detect
									<code class="literal">on</code>
									/
									<code class="literal">off</code>
									or
									<code class="literal">1</code>
									,
									<code class="literal">2</code>
									,
									<code class="literal">3</code>
									form of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_lower_case_table_names"
										target="_top"><code class="literal">lower_case_table_names</code></a>
									value on server. (Bug #2578)
								</p></li>
							<li class="listitem"><p>
									Return
									<code class="literal">[B</code>
									instead of
									<code class="literal">java.lang.Object</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">BINARY</code></a>, <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html"
										target="_top"><code class="literal">VARBINARY</code></a> and
									<code class="literal">LONGVARBINARY</code>
									types from
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									(JDBC compliance). (Bug #2855)
								</p></li>
							<li class="listitem"><p>
									Issue connection events on all instances created from a
									<code class="literal">ConnectionPoolDataSource</code>
									. (Bug #2855)
								</p></li>
							<li class="listitem"><p>
									Trigger a
									<code class="literal">SET NAMES utf8</code>
									when encoding is forced to
									<code class="literal">utf8</code>
									<span class="emphasis"><em>or</em></span>
									<code class="literal">utf-8</code>
									using the
									<code class="literal">characterEncoding</code>
									property. Previously, only the Java-style encoding name of
									<code class="literal">utf-8</code>
									would trigger this.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-10"></a>A.4.8. Changes in MySQL
									Connector/J 3.0.10 (2004-01-13)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed regression of
									<code class="literal">Statement.getGeneratedKeys()</code>
									and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/replace.html"
										target="_top"><code class="literal">REPLACE</code></a>
									statements. (Bug #1576)
								</p></li>
							<li class="listitem"><p>
									Implement
									<code class="literal">ResultSet.updateClob()</code>
									. (Bug #1913)
								</p></li>
							<li class="listitem"><p>
									Enable caching of the parsing stage of prepared statements
									using the
									<code class="literal">cachePrepStmts</code>
									,
									<code class="literal">prepStmtCacheSize</code>
									, and
									<code class="literal">prepStmtCacheSqlLimit</code>
									properties (disabled by default). (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									Foreign Keys column sequence is not consistent in
									<code class="literal">DatabaseMetaData.getImported/Exported/CrossReference()</code>
									. (Bug #1731)
								</p></li>
							<li class="listitem"><p>
									Subsequent call to
									<code class="literal">ResultSet.updateFoo()</code>
									causes NPE if result set is not updatable. (Bug #1630)
								</p></li>
							<li class="listitem"><p>
									Backported fix for aliased tables and
									<code class="literal">UpdatableResultSets</code>
									in
									<code class="literal">checkUpdatability()</code>
									method from 3.1 branch. (Bug #1534)
								</p></li>
							<li class="listitem"><p>
									Fixed security exception when used in Applets (applets can't
									read the system property
									<code class="literal">file.encoding</code>
									which is needed for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
										target="_top"><code class="literal">LOAD DATA LOCAL
											INFILE</code></a>). (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									Speed up parsing of
									<code class="literal">PreparedStatements</code>
									, try to use one-pass whenever possible. (Bug #2006)
								</p></li>
							<li class="listitem"><p>Support escape sequence {fn
									convert ... }. (Bug #1914)</p></li>
							<li class="listitem"><p>Autoreconnect code didn't set
									catalog upon reconnect if it had been changed. (Bug #1913)</p></li>
							<li class="listitem"><p>
									Fixed exception
									<code class="literal">Unknown character set 'danish'</code>
									on connect with JDK-1.4.0 (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									Fixed mappings in SQLError to report deadlocks with SQLStates
									of
									<code class="literal">41000</code>
									. (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getObject()</code>
									on <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">TINYINT</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">SMALLINT</code></a>
									columns should return Java type
									<code class="literal">Integer</code>
									. (Bug #1913)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ArrayIndexOutOfBounds</code>
									when parameter number == number of parameters + 1. (Bug #1958)
								</p></li>
							<li class="listitem"><p>
									Added more descriptive error message
									<code class="literal">Server Configuration Denies Access
										to DataSource</code>
									, as well as retrieval of message from server. (Bug #1913)
								</p></li>
							<li class="listitem"><p>
									<span class="quote">“<span class="quote">Friendlier</span>”
									</span> exception message for
									<code class="literal">PacketTooLargeException</code>
									. (Bug #1534)
								</p></li>
							<li class="listitem"><p>
									Don't count quoted IDs when inside a 'string' in
									<code class="literal">PreparedStatement</code>
									parsing. (Bug #1511)
								</p></li>
							<li class="listitem"><p>
									Removed static synchronization bottleneck from instance factory
									method of
									<code class="literal">SingleByteCharsetConverter</code>
									. (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									Removed static synchronization bottleneck from
									<code class="literal">PreparedStatement.setTimestamp()</code>
									. (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.findColumn()</code>
									should use first matching column name when there are duplicate
									column names in <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a> query
									(JDBC-compliance). (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">maxRows</code>
									property would affect internal statements, so check it for all
									statement creation internal to the driver, and set to 0 when it
									is not. (Bug #2006)
								</p></li>
							<li class="listitem"><p>Barge blobs and split packets
									not being read correctly. (Bug #1576)</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSetMetaData.isCaseSensitive()</code>
									returned wrong value for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">CHAR</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/char.html"
										target="_top"><code class="literal">VARCHAR</code></a>
									columns. (Bug #1913)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getSystemFunction()</code>
									returning bad function
									<code class="literal">VResultsSion</code>
									. (Bug #1775)
								</p></li>
							<li class="listitem"><p>Use constants for SQLStates.
									(Bug #2006)</p></li>
							<li class="listitem"><p>Fix for 4.1.1-style
									authentication with no password. (Bug #1630)</p></li>
							<li class="listitem"><p>Cross-database updatable result
									sets are not checked for updatability correctly. (Bug #1592)</p></li>
							<li class="listitem"><p>
									Statements being created too many times in
									<code class="literal">DBMD.extractForeignKeyFromCreateTable()</code>
									. (Bug #1925)
								</p></li>
							<li class="listitem"><p>
									Map charset
									<code class="literal">ko18_ru</code>
									to
									<code class="literal">ko18r</code>
									when connected to MySQL-4.1.0 or newer. (Bug #2006)
								</p></li>
							<li class="listitem"><p>
									Fix for
									<code class="literal">ArrayIndexOutOfBounds</code>
									exception when using
									<code class="literal">Statement.setMaxRows()</code>
									. (Bug #1695)
								</p></li>
							<li class="listitem"><p>
									Connection property
									<code class="literal">maxRows</code>
									not honored. (Bug #1933)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">alwaysClearStream</code>
									connection property, which causes the driver to always empty
									any remaining data on the input stream before each query. (Bug
									#1913)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									should return
									<code class="literal">Types.LONGVARCHAR</code>
									for MySQL <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">LONGTEXT</code></a> type.
									(Bug #1592)
								</p></li>
							<li class="listitem"><p>
									Ensure that
									<code class="literal">Buffer.writeString()</code>
									saves room for the
									<code class="literal">\0</code>
									. (Bug #2006)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-9"></a>A.4.9. Changes in MySQL Connector/J
									3.0.9 (2003-10-07)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Issue exception on
									<code class="literal">
										ResultSet.get<em class="replaceable"><code>XXX</code></em>()
									</code>
									on empty result set (wasn't caught in some cases). (Bug #848)
								</p></li>
							<li class="listitem"><p>
									Made
									<code class="literal">databaseName</code>
									,
									<code class="literal">portNumber</code>
									, and
									<code class="literal">serverName</code>
									optional parameters for
									<code class="literal">MysqlDataSourceFactory</code>
									. (Bug #1246)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.get/setString</code>
									mashing char 127. (Bug #1247)
								</p></li>
							<li class="listitem"><p>
									Double-escaping of
									<code class="literal">'\'</code>
									when charset is SJIS or GBK and
									<code class="literal">'\'</code>
									appears in nonescaped input. (Bug #879)
								</p></li>
							<li class="listitem"><p>Don't hide messages from
									exceptions thrown in I/O layers. (Bug #848)</p></li>
							<li class="listitem"><p>
									Support
									<code class="literal">InnoDB</code>
									constraint names when extracting foreign key information in
									<code class="literal">DatabaseMetaData</code>
									(implementing ideas from Parwinder Sekhon). (Bug #664, Bug
									#517)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">CLOB.truncate()</code>
									. (Bug #1130)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.previous()</code>
									behavior to move current position to before result set when on
									first row of result set. (Bug #496)
								</p></li>
							<li class="listitem"><p>Backported 4.1 protocol changes
									from 3.1 branch (server-side SQL states, new field information,
									larger client capability flags, connect-with-database, and so
									forth). (Bug #664, Bug #517)</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">Statement</code>
									and
									<code class="literal">PreparedStatement</code>
									issuing bogus queries when
									<code class="literal">setMaxRows()</code>
									had been used and a
									<code class="literal">LIMIT</code>
									clause was present in the query. (Bug #496)
								</p></li>
							<li class="listitem"><p>
									Added property to <span class="quote">“<span
										class="quote">clobber</span>”
									</span> streaming results, by setting the
									<code class="literal">clobberStreamingResults</code>
									property to
									<code class="literal">true</code>
									(the default is
									<code class="literal">false</code>
									). This will cause a <span class="quote">“<span
										class="quote">streaming</span>”
									</span>
									<code class="literal">ResultSet</code>
									to be automatically closed, and any outstanding data still
									streaming from the server to be discarded if another query is
									executed before all the data has been read from the server.
									(Bug #1247)
								</p></li>
							<li class="listitem"><p>
									When emptying input stream of unused rows for <span
										class="quote">“<span class="quote">streaming</span>”
									</span> result sets, have the current thread
									<code class="literal">yield()</code>
									every 100 rows to not monopolize CPU time. (Bug #879)
								</p></li>
							<li class="listitem"><p>
									Fixed deadlock issue with
									<code class="literal">Statement.setMaxRows()</code>
									. (Bug #1099)
								</p></li>
							<li class="listitem"><p>
									Don't wrap
									<code class="literal">SQLExceptions</code>
									in
									<code class="literal">RowDataDynamic</code>
									. (Bug #688)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">com.mysql.jdbc.util.BaseBugReport</code>
									to help creation of testcases for bug reports. (Bug #1247)
								</p></li>
							<li class="listitem"><p>
									Clip +/- INF (to smallest and largest representative values for
									the type in MySQL) and NaN (to 0) for
									<code class="literal">setDouble</code>
									/
									<code class="literal">setFloat()</code>
									, and issue a warning on the statement when the server does not
									support +/- INF or NaN. (Bug #884)
								</p></li>
							<li class="listitem"><p>Don't try and reset isolation
									level on reconnect if MySQL doesn't support them. (Bug #688)</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									getting confused about the keyword <span class="quote">“<span
										class="quote">set</span>”
									</span> in character columns. (Bug #1099)
								</p></li>
							<li class="listitem"><p>Fixed regression in large
									split-packet handling. (Bug #848)</p></li>
							<li class="listitem"><p>
									Fixed test for end of buffer in
									<code class="literal">Buffer.readString()</code>
									.
								</p></li>
							<li class="listitem"><p>
									The
									<code class="literal">insertRow</code>
									in an
									<code class="literal">UpdatableResultSet</code>
									is now loaded with the default column values when
									<code class="literal">moveToInsertRow()</code>
									is called. (Bug #688)
								</p></li>
							<li class="listitem"><p>
									Better diagnostic error messages in exceptions for <span
										class="quote">“<span class="quote">streaming</span>”
									</span> result sets. (Bug #848)
								</p></li>
							<li class="listitem"><p>Backported authentication
									changes for 4.1.1 and newer from 3.1 branch. (Bug #1247)</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getColumns()</code>
									wasn't returning
									<code class="literal">NULL</code>
									for default values that are specified as
									<code class="literal">NULL</code>
									. (Bug #688)
								</p></li>
							<li class="listitem"><p>
									Don't change timestamp TZ twice if
									<code class="literal">useTimezone==true</code>
									. (Bug #774)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">refreshRow</code>
									didn't work when primary key values contained values that
									needed to be escaped (they ended up being doubly escaped). (Bug
									#661)
								</p></li>
							<li class="listitem"><p>
									Fix
									<code class="literal">UpdatableResultSet</code>
									to return values for
									<code class="literal">
										get<em class="replaceable"><code>XXX</code></em>()
									</code>
									when on insert row. (Bug #675)
								</p></li>
							<li class="listitem"><p>
									Don't fire connection closed events when closing pooled
									connections, or on
									<code class="literal">PooledConnection.getConnection()</code>
									with already open connections. (Bug #884)
								</p></li>
							<li class="listitem"><p>
									Change default statement type/concurrency to
									<code class="literal">TYPE_FORWARD_ONLY</code>
									and
									<code class="literal">CONCUR_READ_ONLY</code>
									(spec compliance). (Bug #688)
								</p></li>
							<li class="listitem"><p>
									Faster date handling code in
									<code class="literal">ResultSet</code>
									and
									<code class="literal">PreparedStatement</code>
									(no longer uses
									<code class="literal">Date</code>
									methods that synchronize on static calendars).
								</p></li>
							<li class="listitem"><p>
									Optimized
									<code class="literal">CLOB.setChracterStream()</code>
									. (Bug #1131)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-8"></a>A.4.10. Changes in MySQL
									Connector/J 3.0.8 (2003-05-23)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed SJIS encoding bug, thanks
									to Naoto Sato. (Bug #378)</p></li>
							<li class="listitem"><p>
									Allow bogus URLs in
									<code class="literal">Driver.getPropertyInfo()</code>
									.
								</p></li>
							<li class="listitem"><p>Fix problem detecting server
									character set in some cases. (Bug #378)</p></li>
							<li class="listitem"><p>
									Allow multiple calls to
									<code class="literal">Statement.close()</code>
									. (Bug #378)
								</p></li>
							<li class="listitem"><p>
									Return correct number of generated keys when using <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/replace.html"
										target="_top"><code class="literal">REPLACE</code></a>
									statements. (Bug #378)
								</p></li>
							<li class="listitem"><p>
									Unicode character 0xFFFF in a string would cause the driver to
									throw an
									<code class="literal">ArrayOutOfBoundsException</code>
									. . (Bug #378)
								</p></li>
							<li class="listitem"><p>
									Return list of generated keys when using multi-value
									<code class="literal">INSERTS</code>
									with
									<code class="literal">Statement.getGeneratedKeys()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed result set not getting set for
									<code class="literal">Statement.executeUpdate()</code>
									, which affected
									<code class="literal">getGeneratedKeys()</code>
									and
									<code class="literal">getUpdateCount()</code>
									in some cases.
								</p></li>
							<li class="listitem"><p>
									Changed Ant target
									<code class="literal">compile-core</code>
									to
									<code class="literal">compile-driver</code>
									, and made testsuite compilation a separate target.
								</p></li>
							<li class="listitem"><p>
									Fix infinite loop with
									<code class="literal">Connection.cleanup()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fix row data decoding error when using <span class="emphasis"><em>very</em></span>
									large packets. (Bug #378)
								</p></li>
							<li class="listitem"><p>Optimized row data decoding.
									(Bug #378)</p></li>
							<li class="listitem"><p>
									Use JVM charset with file names and
									<code class="literal">LOAD DATA [LOCAL] INFILE</code>
									.
								</p></li>
							<li class="listitem"><p>Issue exception when operating
									on an already closed prepared statement. (Bug #378)</p></li>
							<li class="listitem"><p>
									Optimized usage of
									<code class="literal">EscapeProcessor</code>
									. (Bug #378)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-7"></a>A.4.11. Changes in MySQL
									Connector/J 3.0.7 (2003-04-08)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Throw
									<code class="literal">SQLExceptions</code>
									when trying to do operations on a forcefully closed
									<code class="literal">Connection</code>
									(that is, when a communication link failure occurs).
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.getTimestamp()</code>
									when underlying field is of type <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATE</code></a>.
								</p></li>
							<li class="listitem"><p>
									Fixed escaping of 0x5c (
									<code class="literal">'\'</code>
									) character for GBK and Big5 charsets.
								</p></li>
							<li class="listitem"><p>
									Don't reset
									<code class="literal">Connection.isReadOnly()</code>
									when autoReconnecting.
								</p></li>
							<li class="listitem"><p>
									Ensure that packet size from
									<code class="literal">alignPacketSize()</code>
									does not exceed <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>
									(JVM bug)
								</p></li>
							<li class="listitem"><p>
									Don't pick up indexes that start with
									<code class="literal">pri</code>
									as primary keys for
									<code class="literal">DBMD.getPrimaryKeys()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/load-data.html"
										target="_top"><code class="literal">LOAD DATA LOCAL
											INFILE</code></a> bug when file &gt; <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet"
										target="_top"><code class="literal">max_allowed_packet</code></a>.
								</p></li>
							<li class="listitem"><p>
									Updatable
									<code class="literal">ResultSets</code>
									can now be created for aliased tables/columns when connected to
									MySQL-4.1 or newer.
								</p></li>
							<li class="listitem"><p>
									Fixed missing conversion for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/year.html"
										target="_top"><code class="literal">YEAR</code></a> type in
									<code class="literal">ResultSetMetaData.getColumnTypeName()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Remove synchronization from
									<code class="literal">Driver.connect()</code>
									and
									<code class="literal">Driver.acceptsUrl()</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">IOExceptions</code>
									during a transaction now cause the
									<code class="literal">Connection</code>
									to be closed.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">StringIndexOutOfBoundsException</code>
									in
									<code class="literal">PreparedStatement.setClob()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">MysqlPooledConnection.close()</code>
									calling wrong event type.
								</p></li>
							<li class="listitem"><p>4.1 Column Metadata fixes.</p></li>
							<li class="listitem"><p>
									You can now toggle profiling on/off using
									<code class="literal">Connection.setProfileSql(boolean)</code>
									.
								</p></li>
							<li class="listitem"><p>Fixed charset issues with
									database metadata (charset was not getting set correctly).</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-6"></a>A.4.12. Changes in MySQL
									Connector/J 3.0.6 (2003-02-18)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Add <span class="quote">“<span class="quote">window</span>”
									</span> of different
									<code class="literal">NULL</code>
									sorting behavior to
									<code class="literal">DBMD.nullsAreSortedAtStart</code>
									(4.0.2 to 4.0.10, true; otherwise, no).
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Blob.setBytes()</code>
									. You still need to pass the resultant
									<code class="literal">Blob</code>
									back into an updatable
									<code class="literal">ResultSet</code>
									or
									<code class="literal">PreparedStatement</code>
									to persist the changes, because MySQL does not support <span
										class="quote">“<span class="quote">locators</span>”
									</span>.
								</p></li>
							<li class="listitem"><p>
									More checks added in
									<code class="literal">ResultSet</code>
									traversal method to catch when in closed state.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.isWritable()</code>
									to return correct value.
								</p></li>
							<li class="listitem"><p>
									Clean up
									<code class="literal">Statement</code>
									query/method mismatch tests (that is, <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/insert.html"
										target="_top"><code class="literal">INSERT</code></a> not
									permitted with
									<code class="literal">.executeQuery()</code>
									).
								</p></li>
							<li class="listitem"><p>
									Allow ignoring of warning for <span class="quote">“<span
										class="quote">non transactional tables</span>”
									</span> during rollback (compliance/usability) by setting
									<code class="literal">ignoreNonTxTables</code>
									property to
									<code class="literal">true</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData</code>
									to return
									<code class="literal">""</code>
									when catalog not known. Fixes
									<code class="literal">NullPointerExceptions</code>
									with Sun's
									<code class="literal">CachedRowSet</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">SQLExceptions</code>
									getting swallowed on initial connect.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DBMD.getTypeInfo()</code>
									and
									<code class="literal">DBMD.getColumns()</code>
									returning different value for precision in <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> types.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">Statement.setMaxRows()</code>
									to stop sending
									<code class="literal">LIMIT</code>
									type queries when not needed (performance).
								</p></li>
							<li class="listitem"><p>Backported 4.1 charset field
									info changes from Connector/J 3.1.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-5"></a>A.4.13. Changes in MySQL
									Connector/J 3.0.5 (2003-01-22)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Greatly reduce memory required for
									<code class="literal">setBinaryStream()</code>
									in
									<code class="literal">PreparedStatements</code>
									.
								</p></li>
							<li class="listitem"><p>
									Retrieve
									<code class="literal">TX_ISOLATION</code>
									from database for
									<code class="literal">Connection.getTransactionIsolation()</code>
									when the MySQL version supports it, instead of an instance
									variable.
								</p></li>
							<li class="listitem"><p>
									Quote table names in
									<code class="literal">DatabaseMetaData.getColumns()</code>
									,
									<code class="literal">getPrimaryKeys()</code>
									,
									<code class="literal">getIndexInfo()</code>
									,
									<code class="literal">getBestRowIdentifier()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">Buffer.fastSkipLenString()</code>
									causing
									<code class="literal">ArrayIndexOutOfBounds</code>
									exceptions with some queries when unpacking fields.
								</p></li>
							<li class="listitem"><p>Added update options for foreign
									key metadata.</p></li>
							<li class="listitem"><p>
									Implemented an empty
									<code class="literal">TypeMap</code>
									for
									<code class="literal">Connection.getTypeMap()</code>
									so that some third-party apps work with MySQL (IBM WebSphere
									5.0 Connection pool).
								</p></li>
							<li class="listitem"><p>
									Added missing <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">LONGTEXT</code></a> type
									to
									<code class="literal">DBMD.getColumns()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.isBeforeFirst()</code>
									for empty result sets.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-4"></a>A.4.14. Changes in MySQL
									Connector/J 3.0.4 (2003-01-06)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added support for quoted identifiers in
									<code class="literal">PreparedStatement</code>
									parser.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">strictUpdates</code>
									property to enable control of amount of checking for <span
										class="quote">“<span class="quote">correctness</span>”
									</span> of updatable result sets. Set this to
									<code class="literal">false</code>
									if you want faster updatable result sets and you know that you
									create them from <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/select.html"
										target="_top"><code class="literal">SELECT</code></a>
									statements on tables with primary keys and that you have
									selected all primary keys in your query.
								</p></li>
							<li class="listitem"><p>
									Reduce memory footprint of
									<code class="literal">PreparedStatements</code>
									by sharing outbound packet with
									<code class="literal">MysqlIO</code>
									.
								</p></li>
							<li class="listitem"><p>Added support for 4.0.8-style
									large packets.</p></li>
							<li class="listitem"><p>
									Added quoted identifiers to database names for
									<code class="literal">Connection.setCatalog</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">PreparedStatement.executeBatch()</code>
									parameter overwriting.
								</p></li>
							<li class="listitem"><p>
									Streamlined character conversion and
									<code class="literal">byte[]</code>
									handling in
									<code class="literal">PreparedStatements</code>
									for
									<code class="literal">setByte()</code>
									.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-3"></a>A.4.15. Changes in MySQL
									Connector/J 3.0.3 (2002-12-17)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Changed
									<code class="literal">SingleByteCharConverter</code>
									to use lazy initialization of each converter.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.getPrecision()</code>
									returning incorrect values for some floating-point types.
								</p></li>
							<li class="listitem"><p>
									Check for connection closed in more
									<code class="literal">Connection</code>
									methods (
									<code class="literal">createStatement</code>
									,
									<code class="literal">prepareStatement</code>
									,
									<code class="literal">setTransactionIsolation</code>
									,
									<code class="literal">setAutoCommit</code>
									).
								</p></li>
							<li class="listitem"><p>Some MySQL-4.1 protocol support
									(extended field info from selects).</p></li>
							<li class="listitem"><p>
									More robust implementation of updatable result sets. Checks
									that <span class="emphasis"><em>all</em></span> primary keys of
									the table have been selected.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMD.getImported/ExportedKeys()</code>
									now handles multiple foreign keys per table.
								</p></li>
							<li class="listitem"><p>
									Honor <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_lower_case_table_names"
										target="_top"><code class="literal">lower_case_table_names</code></a>
									when enabled in the server when doing table name comparisons in
									<code class="literal">DatabaseMetaData</code>
									methods.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">CLIENT_LONG_FLAG</code>
									to be able to get more column flags (
									<code class="literal">isAutoIncrement()</code>
									being the most important).
								</p></li>
							<li class="listitem"><p>
									Substitute
									<code class="literal">'?'</code>
									for unknown character conversions in single-byte character sets
									instead of
									<code class="literal">'\0'</code>
									.
								</p></li>
							<li class="listitem"><p>
									Because of above, implemented
									<code class="literal">ResultSetMetaData.isAutoIncrement()</code>
									to use
									<code class="literal">Field.isAutoIncrement()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed charset handling in
									<code class="literal">Fields.java</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.getColumnTypeName()</code>
									returning <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> for <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> for <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> types.
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Connection.nativeSQL()</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">LOAD DATA LOCAL INFILE ...</code>
									now works, if your server is configured to permit it. Can be
									turned off with the
									<code class="literal">allowLoadLocalInfile</code>
									property (see the
									<code class="filename">README</code>
									).
								</p></li>
							<li class="listitem"><p>
									Use nonaliased table/column names and database names to fully
									qualify tables and columns in
									<code class="literal">UpdatableResultSet</code>
									(requires MySQL-4.1 or newer).
								</p></li>
							<li class="listitem"><p>
									Changed
									<code class="literal">charsToByte</code>
									in
									<code class="literal">SingleByteCharConverter</code>
									to be nonstatic.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">NamedPipeSocketFactory</code>
									now works (only intended for Windows), see
									<code class="filename">README</code>
									for instructions.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">Buffer.isLastDataPacket()</code>
									for 4.1 and newer servers.
								</p></li>
							<li class="listitem"><p>
									More robust escape tokenizer: Recognize
									<code class="literal">--</code>
									comments, and permit nested escape sequences (see
									<code class="literal">testsuite.EscapeProcessingTest</code>
									).
								</p></li>
							<li class="listitem"><p>
									Allow user to alter behavior of
									<code class="literal">Statement</code>
									/
									<code class="literal">PreparedStatement.executeBatch()</code>
									using
									<code class="literal">continueBatchOnError</code>
									property (defaults to
									<code class="literal">true</code>
									).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-2"></a>A.4.16. Changes in MySQL
									Connector/J 3.0.2 (2002-11-08)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Implemented
									<code class="literal">Clob.truncate()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Properly restore connection properties when autoReconnecting or
									failing-over, including
									<code class="literal">autoCommit</code>
									state, and isolation level.
								</p></li>
							<li class="listitem"><p>
									Fixed issue when calling
									<code class="literal">Statement.setFetchSize()</code>
									when using arbitrary values.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">queriesBeforeRetryMaster</code>
									property that specifies how many queries to issue when failed
									over before attempting to reconnect to the master (defaults to
									50).
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.setFetchDirection(FETCH_UNKNOWN)</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added driver property
									<code class="literal">useHostsInPrivileges</code>
									. Defaults to
									<code class="literal">true</code>
									. Affects whether or not
									<code class="literal">@hostname</code>
									will be used in
									<code class="literal">DBMD.getColumn/TablePrivileges</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.isLast()</code>
									for empty result sets (should return
									<code class="literal">false</code>
									).
								</p></li>
							<li class="listitem"><p>Fixed various non-ASCII
									character encoding issues.</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">connectTimeout</code>
									parameter that enables users of JDK-1.4 and newer to specify a
									maximum time to wait to establish a connection.
								</p></li>
							<li class="listitem"><p>
									Fixed start position off-by-1 error in
									<code class="literal">Clob.getSubString()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed issue with updatable result sets and
									<code class="literal">PreparedStatements</code>
									not working.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement</code>
									now honors stream lengths in setBinary/Ascii/Character Stream()
									unless you set the connection property
									<code class="literal">useStreamLengthsInPrepStmts</code>
									to
									<code class="literal">false</code>
									.
								</p></li>
							<li class="listitem"><p>
									Escape
									<code class="literal">0x5c</code>
									character in strings for the SJIS charset.
								</p></li>
							<li class="listitem"><p>
									Removed some not-needed temporary object creation by smarter
									use of
									<code class="literal">Strings</code>
									in
									<code class="literal">EscapeProcessor</code>
									,
									<code class="literal">Connection</code>
									and
									<code class="literal">DatabaseMetaData</code>
									classes.
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">ResultSet.updateBlob()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed incorrect conversion in
									<code class="literal">ResultSet.getLong()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">UnsupportedEncodingException</code>
									thrown when <span class="quote">“<span class="quote">forcing</span>”
									</span> a character encoding using properties.
								</p></li>
							<li class="listitem"><p>
									Removed duplicate code from
									<code class="literal">UpdatableResultSet</code>
									(it can be inherited from
									<code class="literal">ResultSet</code>
									, the extra code for each method to handle updatability I
									thought might someday be necessary has not been needed).
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Clob.setAsciiStream()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DBMD.supportsResultSetConcurrency()</code>
									so that it returns
									<code class="literal">true</code>
									for
									<code class="literal">ResultSet.TYPE_SCROLL_INSENSITIVE</code>
									and
									<code class="literal">ResultSet.CONCUR_READ_ONLY</code>
									or
									<code class="literal">ResultSet.CONCUR_UPDATABLE</code>
									.
								</p></li>
							<li class="listitem"><p>
									Failover and
									<code class="literal">autoReconnect</code>
									work only when the connection is in an
									<code class="literal">autoCommit(false)</code>
									state, to stay transaction-safe.
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Clob.setCharacterStream()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Use <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/show-create-table.html"
										target="_top"><code class="literal">SHOW CREATE
											TABLE</code></a> when possible for determining foreign key information
									for
									<code class="literal">DatabaseMetaData</code>
									. Also enables cascade options for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/delete.html"
										target="_top"><code class="literal">DELETE</code></a>
									information to be returned.
								</p></li>
							<li class="listitem"><p>
									All
									<code class="literal">DBMD</code>
									result set columns describing schemas now return
									<code class="literal">NULL</code>
									to be more compliant with the behavior of other JDBC drivers
									for other database systems (MySQL does not support schemas).
								</p></li>
							<li class="listitem"><p>
									Added SSL support. See
									<code class="filename">README</code>
									for information on how to use it.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">com.mysql.jdbc.MiniAdmin</code>
									class, which enables you to send
									<code class="literal">shutdown</code>
									command to MySQL server. This is intended to be used when <span
										class="quote">“<span class="quote">embedding</span>”
									</span> Java and MySQL server together in an end-user application.
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">Clob.setString()</code>
									.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-1"></a>A.4.17. Changes in MySQL
									Connector/J 3.0.1 (2002-09-21)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Added
									<code class="literal">paranoid</code>
									parameter, which sanitizes error messages by removing <span
										class="quote">“<span class="quote">sensitive</span>”
									</span> information from them (such as host names, ports, or user
									names), as well as clearing <span class="quote">“<span
										class="quote">sensitive</span>”
									</span> data structures when possible.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">LOCAL TEMPORARY</code>
									to table types in
									<code class="literal">DatabaseMetaData.getTableTypes()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">socketTimeout</code>
									parameter to URL.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.close()</code>
									issues
									<code class="literal">rollback()</code>
									when
									<code class="literal">getAutoCommit()</code>
									is
									<code class="literal">false</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">Connection.isClosed()</code>
									no longer <span class="quote">“<span class="quote">pings</span>”
									</span> the server.
								</p></li>
							<li class="listitem"><p>
									Added limited
									<code class="literal">Clob</code>
									functionality (
									<code class="literal">ResultSet.getClob()</code>
									,
									<code class="literal">PreparedStatement.setClob()</code>
									,
									<code class="literal">PreparedStatement.setObject(Clob)</code>
									.
								</p></li>
							<li class="listitem"><p>
									Implemented
									<code class="literal">ResultSet.getCharacterStream()</code>
									.
								</p></li>
							<li class="listitem"><p>Massive code clean-up to follow
									Java coding conventions (the time had come).</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.getRow()</code>
									off-by-one bug.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">RowDataStatic.getAt()</code>
									off-by-one bug.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.isSigned()</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">TINYINT</code></a> and <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">BIGINT</code></a>.
								</p></li>
							<li class="listitem"><p>Charsets now automatically
									detected. Optimized code for single-byte character set
									conversion.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-3-0-0"></a>A.4.18. Changes in MySQL
									Connector/J 3.0.0 (2002-07-31)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Performance enhancements: Driver
									is now 50–100% faster in most situations, and creates fewer
									temporary objects.</p></li>
							<li class="listitem"><p>
									<span class="bold"><strong>!!! LICENSE CHANGE
											!!!</strong></span> The driver is now GPL.
								</p></li>
							<li class="listitem"><p>
									Overall speed improvements using controlling transient object
									creation in
									<code class="literal">MysqlIO</code>
									class when reading packets.
								</p></li>
							<li class="listitem"><p>
									JDBC-3.0 functionality including
									<code class="literal">Statement/PreparedStatement.getGeneratedKeys()</code>
									and
									<code class="literal">ResultSet.getURL()</code>
									.
								</p></li>
							<li class="listitem"><p>Performance improvements in
									string handling and field metadata creation (lazily
									instantiated) contributed by Alex Twisleton-Wykeham-Fiennes.</p></li>
							<li class="listitem"><p>
									Better checking for closed connections in
									<code class="literal">Statement</code>
									and
									<code class="literal">PreparedStatement</code>
									.
								</p></li>
							<li class="listitem"><p>
									Support for large packets (new addition to MySQL-4.0 protocol),
									see
									<code class="filename">README</code>
									for more information.
								</p></li>
							<li class="listitem"><p>
									Repackaging: New driver name is
									<code class="literal">com.mysql.jdbc.Driver</code>
									, old name still works, though (the driver is now provided by
									MySQL-AB).
								</p></li>
							<li class="listitem"><p>
									Added multi-host failover support (see
									<code class="filename">README</code>
									).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getDate/Time/Timestamp</code>
									now recognizes all forms of invalid values that have been set
									to all zeros by MySQL (SF bug 586058).
								</p></li>
							<li class="listitem"><p>JDBC Compliance: Passes all
									tests besides stored procedure tests.</p></li>
							<li class="listitem"><p>
									Testsuite now uses Junit (which you can get from <a
										class="ulink" href="http://www.junit.org" target="_top">http://www.junit.org</a>.
								</p></li>
							<li class="listitem"><p>
									Support for streaming (row-by-row) result sets (see
									<code class="filename">README</code>
									) Thanks to Doron.
								</p></li>
							<li class="listitem"><p>
									Float types now reported as
									<code class="literal">java.sql.Types.FLOAT</code>
									(SF bug 579573).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getTimestamp()</code>
									now works for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">DATE</code></a> types (SF
									bug 559134).
								</p></li>
							<li class="listitem"><p>
									Fix and sort primary key names in
									<code class="literal">DBMetaData</code>
									(SF bugs 582086 and 582086).
								</p></li>
							<li class="listitem"><p>The driver now only works with
									JDK-1.2 or newer.</p></li>
							<li class="listitem"><p>General source-code cleanup.</p></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-2-0-x"></a>A.5. Changes in MySQL Connector/J
								2.0.x
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-2-0-14">A.5.1.
									Changes in MySQL Connector/J 2.0.14 (2002-05-16)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-13">A.5.2.
									Changes in MySQL Connector/J 2.0.13 (2002-04-24)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-12">A.5.3.
									Changes in MySQL Connector/J 2.0.12 (2002-04-07)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-11">A.5.4.
									Changes in MySQL Connector/J 2.0.11 (2002-01-27)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-10">A.5.5.
									Changes in MySQL Connector/J 2.0.10 (2002-01-24)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-9">A.5.6.
									Changes in MySQL Connector/J 2.0.9 (2002-01-13)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-8">A.5.7.
									Changes in MySQL Connector/J 2.0.8 (2001-11-25)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-7">A.5.8.
									Changes in MySQL Connector/J 2.0.7 (2001-10-24)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-6">A.5.9.
									Changes in MySQL Connector/J 2.0.6 (2001-06-16)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-5">A.5.10.
									Changes in MySQL Connector/J 2.0.5 (2001-06-13)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-3">A.5.11.
									Changes in MySQL Connector/J 2.0.3 (2000-12-03)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0-1">A.5.12.
									Changes in MySQL Connector/J 2.0.1 (2000-04-06)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0pre5">A.5.13.
									Changes in MySQL Connector/J 2.0.0pre5 (21 February 2000)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0pre4">A.5.14.
									Changes in MySQL Connector/J 2.0.0pre4 (10 January 2000)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-2-0pre">A.5.15.
									Changes in MySQL Connector/J 2.0.0pre (17 August 1999)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-14"></a>A.5.1. Changes in MySQL
									Connector/J 2.0.14 (2002-05-16)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Quoted identifiers not used if server version does not support
									them. Also, if server started with <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_ansi"
										target="_top"><code class="option">--ansi</code></a> or <a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_sql-mode"
										target="_top"><code class="option">--sql-mode=ANSI_QUOTES</code></a>,
									<span class="quote">“<span class="quote"><code
												class="literal">"</code></span>”
									</span> will be used as an identifier quote character, otherwise <span
										class="quote">“<span class="quote"><code
												class="literal">'</code></span>”
									</span> will be used.
								</p></li>
							<li class="listitem"><p>More code cleanup.</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement</code>
									now releases resources on
									<code class="literal">.close()</code>
									. (SF bug 553268)
								</p></li>
							<li class="listitem"><p>
									Added SQL profiling (to
									<code class="literal">STDERR</code>
									). Set
									<code class="literal">profileSql=true</code>
									in your JDBC URL. See
									<code class="filename">README</code>
									for more information.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">LogicalHandle.isClosed()</code>
									calls through to physical connection.
								</p></li>
							<li class="listitem"><p>
									Fixed typo for
									<code class="literal">relaxAutoCommit</code>
									parameter.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getDouble()</code>
									now uses code built into JDK to be more precise (but slower).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-13"></a>A.5.2. Changes in MySQL
									Connector/J 2.0.13 (2002-04-24)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">ResultSetMetaData.getColumnClassName()</code>
									now implemented.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DBMetaData.getIndexInfo()</code>
									- bad PAGES fixed. (SF BUG 542201)
								</p></li>
							<li class="listitem"><p>
									Rudimentary version of
									<code class="literal">Statement.getGeneratedKeys()</code>
									from JDBC-3.0 now implemented (you need to be using JDK-1.4 for
									this to work, I believe).
								</p></li>
							<li class="listitem"><p>More code cleanup.</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.toString()</code>
									fixed. (SF bug 534026)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">set</code>
									/
									<code class="literal">getPortNumber()</code>
									to
									<code class="literal">DataSource(s)</code>
									. (SF bug 548167)
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">setURL()</code>
									to
									<code class="literal">MySQLXADataSource</code>
									. (SF bug 546019)
								</p></li>
							<li class="listitem"><p>
									Faster blob escaping for
									<code class="literal">PrepStmt</code>
									.
								</p></li>
							<li class="listitem"><p>Fixed unicode chars being read
									incorrectly. (SF bug 541088)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-12"></a>A.5.3. Changes in MySQL
									Connector/J 2.0.12 (2002-04-07)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>General code cleanup.</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">getRow()</code>
									bug (527165) in
									<code class="literal">ResultSet</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.refreshRow()</code>
									implemented.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">getIdleFor()</code>
									method to
									<code class="literal">Connection</code>
									and
									<code class="literal">MysqlLogicalHandle</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">getTable/ColumnPrivileges()</code>
									to DBMD (fixes 484502).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet</code>
									: Fixed updatability (values being set to
									<code class="literal">null</code>
									if not updated).
								</p></li>
							<li class="listitem"><p>
									Fixes for
									<code class="literal">ResultSet</code>
									updatability in
									<code class="literal">PreparedStatement</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added support for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/year.html"
										target="_top"><code class="literal">YEAR</code></a> type
									(533556).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DataSources</code>
									- fixed
									<code class="literal">setUrl</code>
									bug (511614, 525565), wrong datasource class name (532816,
									528767).
								</p></li>
							<li class="listitem"><p>Relaxed synchronization in all
									classes, should fix 520615 and 520393.</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.insertRow()</code>
									should now detect auto_increment fields in most cases and use
									that value in the new row. This detection will not work in
									multi-valued keys, however, due to the fact that the MySQL
									protocol does not return this information.
								</p></li>
							<li class="listitem"><p>
									Added support for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/bit-type.html"
										target="_top"><code class="literal">BIT</code></a> types
									(51870) to
									<code class="literal">PreparedStatement</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added identifier quoting to all
									<code class="literal">DatabaseMetaData</code>
									methods that need them (should fix 518108).
								</p></li>
							<li class="listitem"><p>
									Fixed time zone off-by-1-hour bug in
									<code class="literal">PreparedStatement</code>
									(538286, 528785).
								</p></li>
							<li class="listitem"><p>
									Added new types to
									<code class="literal">getTypeInfo()</code>
									, fixed existing types thanks to Al Davis and Kid Kalanon.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">testsuite.Traversal</code>
									<code class="literal">afterLast()</code>
									bug, thanks to Igor Lastric.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-11"></a>A.5.4. Changes in MySQL
									Connector/J 2.0.11 (2002-01-27)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									More changes to fix
									<code class="literal">Unexpected end of input stream</code>
									errors when reading <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> values.
									This should be the last fix.
								</p></li>
							<li class="listitem"><p>
									Fixed missing
									<code class="literal">DELETE_RULE</code>
									value in
									<code class="literal">DBMD.getImported/ExportedKeys()</code>
									and
									<code class="literal">getCrossReference()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Full synchronization of
									<code class="literal">Statement.java</code>
									.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-10"></a>A.5.5. Changes in MySQL
									Connector/J 2.0.10 (2002-01-24)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed spurious
									<code class="literal">Unexpected end of input stream</code>
									errors in
									<code class="literal">MysqlIO</code>
									(bug 507456).
								</p></li>
							<li class="listitem"><p>
									Fixed null-pointer-exceptions when using
									<code class="literal">MysqlConnectionPoolDataSource</code>
									with Websphere 4 (bug 505839).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-9"></a>A.5.6. Changes in MySQL Connector/J
									2.0.9 (2002-01-13)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Full synchronization on methods
									modifying instance and class-shared references, driver should
									be entirely thread-safe now (please let me know if you have
									problems).</p></li>
							<li class="listitem"><p>
									Fixed off-by-one-hour error in
									<code class="literal">PreparedStatement.setTimestamp()</code>
									(bug 491577).
								</p></li>
							<li class="listitem"><p>
									Implementation of
									<code class="literal">DatabaseMetaData.getExported/ImportedKeys()</code>
									and
									<code class="literal">getCrossReference()</code>
									.
								</p></li>
							<li class="listitem"><p>
									Report batch update support through
									<code class="literal">DatabaseMetaData</code>
									(bug 495101).
								</p></li>
							<li class="listitem"><p>
									<span class="command"><strong>Ant</strong></span> build was
									corrupting included
									<code class="filename">jar</code>
									files, fixed (bug 487669).
								</p></li>
							<li class="listitem"><p>
									Removed concatenation support from driver (the
									<code class="literal">||</code>
									operator), as older versions of VisualAge seem to be the only
									thing that use it, and it conflicts with the logical
									<code class="literal">||</code>
									operator. You will need to start <span class="command"><strong>mysqld</strong></span>
									with the <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_ansi"
										target="_top"><code class="option">--ansi</code></a> flag to
									use the
									<code class="literal">||</code>
									operator as concatenation (bug 491680).
								</p></li>
							<li class="listitem"><p>Fixed quoting error with escape
									processor (bug 486265).</p></li>
							<li class="listitem"><p>
									<code class="literal">DataSource</code>
									implementations moved to
									<code class="literal">org.gjt.mm.mysql.jdbc2.optional</code>
									package, and (initial) implementations of
									<code class="literal">PooledConnectionDataSource</code>
									and
									<code class="literal">XADataSource</code>
									are in place (thanks to Todd Wolff for the implementation and
									testing of
									<code class="literal">PooledConnectionDataSource</code>
									with IBM WebSphere 4).
								</p></li>
							<li class="listitem"><p>
									Fixed casting bug in
									<code class="literal">PreparedStatement</code>
									(bug 488663).
								</p></li>
							<li class="listitem"><p>Added detection of network
									connection being closed when reading packets (thanks to Todd
									Lizambri).</p></li>
							<li class="listitem"><p>
									Fixed extra memory allocation in
									<code class="literal">MysqlIO.readPacket()</code>
									(bug 488663).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-8"></a>A.5.7. Changes in MySQL Connector/J
									2.0.8 (2001-11-25)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.setAnyNumericType()</code>
									now handles positive exponents correctly (adds
									<code class="literal">+</code>
									so MySQL can understand it).
								</p></li>
							<li class="listitem"><p>Batch updates now supported
									(thanks to some inspiration from Daniel Rall).</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getPrimaryKeys()</code>
									and
									<code class="literal">getBestRowIdentifier()</code>
									are now more robust in identifying primary keys (matches
									regardless of case or abbreviation/full spelling of
									<code class="literal">Primary Key</code>
									in
									<code class="literal">Key_type</code>
									column).
								</p></li>
							<li class="listitem"><p>
									<code class="literal">XADataSource</code>
									/
									<code class="literal">ConnectionPoolDataSource</code>
									code (experimental)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-7"></a>A.5.8. Changes in MySQL Connector/J
									2.0.7 (2001-10-24)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.isAfterLast()</code>
									always returning
									<code class="literal">false</code>
									.
								</p></li>
							<li class="listitem"><p>PreparedStatement.setBoolean()
									will use 1/0 for values if your MySQL version is 3.21.23 or
									higher.</p></li>
							<li class="listitem"><p>
									Updatable result sets now correctly handle
									<code class="literal">NULL</code>
									values in fields.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">DatabaseMetaData.supportsTransactions()</code>
									, and
									<code class="literal">supportsTransactionIsolationLevel()</code>
									and
									<code class="literal">getTypeInfo()</code>
									<code class="literal">SQL_DATETIME_SUB</code>
									and
									<code class="literal">SQL_DATA_TYPE</code>
									fields not being readable.
								</p></li>
							<li class="listitem"><p>PreparedStatement.setDouble()
									now uses full-precision doubles (reverting a fix made earlier
									to truncate them).</p></li>
							<li class="listitem"><p>
									Fixed time zone issue in
									<code class="literal">PreparedStatement.setTimestamp()</code>
									. (thanks to Erik Olofsson)
								</p></li>
							<li class="listitem"><p>
									Fixed dangling socket problem when in high availability (
									<code class="literal">autoReconnect=true</code>
									) mode, and finalizer for
									<code class="literal">Connection</code>
									will close any dangling sockets on GC.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.getPrecision()</code>
									returning one less than actual on newer versions of MySQL.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getBlob()</code>
									now returns
									<code class="literal">null</code>
									if column value was
									<code class="literal">null</code>
									.
								</p></li>
							<li class="listitem"><p>
									Capitalize type names when
									<code class="literal">capitalizeTypeNames=true</code>
									is passed in URL or properties (for WebObjects. (thanks to Anjo
									Krank)
								</p></li>
							<li class="listitem"><p>
									<code class="literal">PreparedStatement.setCharacterStream()</code>
									now implemented
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">PreparedStatement</code>
									generating SQL that would end up with syntax errors for some
									queries.
								</p></li>
							<li class="listitem"><p>Initial transaction isolation
									level read from database (if available). (thanks to Dmitry
									Vereshchagin)</p></li>
							<li class="listitem"><p>
									Character sets read from database if
									<code class="literal">useUnicode=true</code>
									and
									<code class="literal">characterEncoding</code>
									is not set. (thanks to Dmitry Vereshchagin)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-6"></a>A.5.9. Changes in MySQL Connector/J
									2.0.6 (2001-06-16)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed case-sensitive column names in
									<code class="literal">ResultSet.java</code>
									.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">PreparedStatement</code>
									parameter checking.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-5"></a>A.5.10. Changes in MySQL
									Connector/J 2.0.5 (2001-06-13)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSet.getBlob()</code>
									<code class="literal">ArrayIndex</code>
									out-of-bounds.
								</p></li>
							<li class="listitem"><p>
									Fixed NPE on
									<code class="literal">PreparedStatement.executeUpdate()</code>
									when all columns have not been set.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ArrayIndexOutOfBounds</code>
									when sending large <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a> queries.
									(Max size packet was not being set)
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">ResultSetMetaData.getColumnTypeName</code>
									for <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a>/<a
										class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">BLOB</code></a>.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">getObject()</code>
									on
									<code class="literal">ResultSet</code>
									correctly does <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">TINYINT</code></a>-&gt;
									<code class="literal">Byte</code>
									and <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/integer-types.html"
										target="_top"><code class="literal">SMALLINT</code></a>-&gt;
									<code class="literal">Short</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet</code>
									has +/-Inf/inf support.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.getBoolean()</code>
									now recognizes
									<code class="literal">-1</code>
									as
									<code class="literal">true</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">DataBaseMetaData.getCrossReference()</code>
									no longer
									<code class="literal">ArrayIndexOOB</code>
									.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">ISOLATION</code>
									level support to
									<code class="literal">Connection.setIsolationLevel()</code>
								</p></li>
							<li class="listitem"><p>
									Fixed data parsing of <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html"
										target="_top"><code class="literal">TIMESTAMP</code></a>
									values with 2-digit years.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">Byte</code>
									to
									<code class="literal">PreparedStatement.setObject()</code>
									.
								</p></li>
							<li class="listitem"><p>
									<code class="literal">ResultSet.insertRow()</code>
									works now, even if not all columns are set (they will be set to
									<code class="literal">NULL</code>
									).
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-3"></a>A.5.11. Changes in MySQL
									Connector/J 2.0.3 (2000-12-03)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Implemented
									<code class="literal">getBigDecimal()</code>
									without scale component for JDBC2.
								</p></li>
							<li class="listitem"><p>
									Added
									<code class="literal">ultraDevHack</code>
									URL parameter, set to
									<code class="literal">true</code>
									to enable (broken) Macromedia UltraDev to use the driver.
								</p></li>
							<li class="listitem"><p>Added detection of -/+INF for
									doubles.</p></li>
							<li class="listitem"><p>
									Fixed incorrect detection of
									<code class="literal">MAX_ALLOWED_PACKET</code>
									, so sending large blobs should work now.
								</p></li>
							<li class="listitem"><p>
									Fixed off-by-one error in
									<code class="literal">java.sql.Blob</code>
									implementation code.
								</p></li>
							<li class="listitem"><p>Faster ASCII string operations.
								</p></li>
							<li class="listitem"><p>Fixed composite key problem with
									updatable result sets.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0-1"></a>A.5.12. Changes in MySQL
									Connector/J 2.0.1 (2000-04-06)
								</h3>
							</div>
						</div>
					</div>
					<p>
						<span class="bold"><strong>Bugs Fixed</strong></span>
					</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Fixed some issues with updatability support in
									<code class="literal">ResultSet</code>
									when using multiple primary keys.
								</p></li>
							<li class="listitem"><p>
									No escape processing is done on
									<code class="literal">PreparedStatements</code>
									anymore per JDBC spec.
								</p></li>
							<li class="listitem"><p>Fixed many JDBC-2.0 traversal,
									positioning bugs, especially with respect to empty result sets.
									Thanks to Ron Smits, Nick Brook, Cessar Garcia and Carlos
									Martinez.</p></li>
							<li class="listitem"><p>
									<code class="literal">DatabaseMetaData.getPrimaryKeys()</code>
									now works correctly with respect to
									<code class="literal">key_seq</code>
									. Thanks to Brian Slesinsky.
								</p></li>
							<li class="listitem"><p>
									Fixed
									<code class="literal">RSMD.isWritable()</code>
									returning wrong value. Thanks to Moritz Maass.
								</p></li>
							<li class="listitem"><p>Cleaned up exception handling
									when driver connects.</p></li>
							<li class="listitem"><p>
									Columns that are of type <a class="ulink"
										href="http://dev.mysql.com/doc/refman/5.5/en/blob.html"
										target="_top"><code class="literal">TEXT</code></a> now return
									as
									<code class="literal">Strings</code>
									when you use
									<code class="literal">getObject()</code>
									.
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0pre5"></a>A.5.13. Changes in MySQL
									Connector/J 2.0.0pre5 (21 February 2000)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed Bad Handshake problem.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0pre4"></a>A.5.14. Changes in MySQL
									Connector/J 2.0.0pre4 (10 January 2000)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixes to ResultSet for
									insertRow() - Thanks to Cesar Garcia</p></li>
							<li class="listitem"><p>Fix to Driver to recognize
									JDBC-2.0 by loading a JDBC-2.0 class, instead of relying on JDK
									version numbers. Thanks to John Baker.</p></li>
							<li class="listitem"><p>Fixed ResultSet to return
									correct row numbers</p></li>
							<li class="listitem"><p>Statement.getUpdateCount() now
									returns rows matched, instead of rows actually updated, which
									is more SQL-92 like.</p></li>
						</ul>
					</div>
					<p>10-29-99</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Statement/PreparedStatement.getMoreResults() bug fixed. Thanks
									to Noel J. Bergman.</p></li>
							<li class="listitem"><p>Added Short as a type to
									PreparedStatement.setObject(). Thanks to Jeff Crowder</p></li>
							<li class="listitem"><p>Driver now automagically
									configures maximum/preferred packet sizes by querying server.</p></li>
							<li class="listitem"><p>Autoreconnect code uses fast
									ping command if server supports it.</p></li>
							<li class="listitem"><p>Fixed various bugs with respect
									to packet sizing when reading from the server and when
									alloc'ing to write to the server.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-2-0pre"></a>A.5.15. Changes in MySQL
									Connector/J 2.0.0pre (17 August 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Now compiles under JDK-1.2. The
									driver supports both JDK-1.1 and JDK-1.2 at the same time
									through a core set of classes. The driver will load the
									appropriate interface classes at runtime by figuring out which
									JVM version you are using.</p></li>
							<li class="listitem"><p>Fixes for result sets with all
									nulls in the first row. (Pointed out by Tim Endres)</p></li>
							<li class="listitem"><p>Fixes to column numbers in
									SQLExceptions in ResultSet (Thanks to Blas Rodriguez Somoza)</p></li>
							<li class="listitem"><p>The database no longer needs to
									specified to connect. (Thanks to Christian Motschke)</p></li>
						</ul>
					</div>
				</div>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="cj-news-1-2-x"></a>A.6. Changes in MySQL Connector/J
								1.2.x and lower
							</h2>
						</div>
					</div>
				</div>
				<div class="toc">
					<dl>
						<dt>
							<span class="section"><a href="#cj-news-1-2b">A.6.1.
									Changes in MySQL Connector/J 1.2b (04 July 1999)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-2a">A.6.2.
									Changes in MySQL Connector/J 1.2a (14 April 1999)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1i">A.6.3.
									Changes in MySQL Connector/J 1.1i (24 March 1999)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1h">A.6.4.
									Changes in MySQL Connector/J 1.1h (08 March 1999)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1g">A.6.5.
									Changes in MySQL Connector/J 1.1g (19 February 1999)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1f">A.6.6.
									Changes in MySQL Connector/J 1.1f (31 December 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1b">A.6.7.
									Changes in MySQL Connector/J 1.1b (03 November 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-1">A.6.8.
									Changes in MySQL Connector/J 1.1 (02 September 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-1-0">A.6.9.
									Changes in MySQL Connector/J 1.0 (24 August 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-0-9d">A.6.10.
									Changes in MySQL Connector/J 0.9d (04 August 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-0-9">A.6.11.
									Changes in MySQL Connector/J 0.9 (28 July 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-0-8">A.6.12.
									Changes in MySQL Connector/J 0.8 (06 July 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-0-7">A.6.13.
									Changes in MySQL Connector/J 0.7 (01 July 1998)</a></span>
						</dt>
						<dt>
							<span class="section"><a href="#cj-news-0-6">A.6.14.
									Changes in MySQL Connector/J 0.6 (21 May 1998)</a></span>
						</dt>
					</dl>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-2b"></a>A.6.1. Changes in MySQL Connector/J
									1.2b (04 July 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Better Documentation (in
									progress), in doc/mm.doc/book1.html</p></li>
							<li class="listitem"><p>DBMD now permits null for a
									column name pattern (not in spec), which it changes to '%'.</p></li>
							<li class="listitem"><p>DBMD now has correct
									types/lengths for getXXX().</p></li>
							<li class="listitem"><p>ResultSet.getDate(), getTime(),
									and getTimestamp() fixes. (contributed by Alan Wilken)</p></li>
							<li class="listitem"><p>EscapeProcessor now handles \{
									\} and { or } inside quotation marks correctly. (thanks to Alik
									for some ideas on how to fix it)</p></li>
							<li class="listitem"><p>Fixes to properties handling in
									Connection. (contributed by Juho Tikkala)</p></li>
							<li class="listitem"><p>ResultSet.getObject() now
									returns null for NULL columns in the table, rather than bombing
									out. (thanks to Ben Grosman)</p></li>
							<li class="listitem"><p>ResultSet.getObject() now
									returns Strings for types from MySQL that it doesn't know
									about. (Suggested by Chris Perdue)</p></li>
							<li class="listitem"><p>Removed DataInput/Output
									streams, not needed, 1/2 number of method calls per IO
									operation.</p></li>
							<li class="listitem"><p>Use default character encoding
									if one is not specified. This is a work-around for broken JVMs,
									because according to spec, EVERY JVM must support "ISO8859_1",
									but they do not.</p></li>
							<li class="listitem"><p>Fixed Connection to use the
									platform character encoding instead of "ISO8859_1" if one isn't
									explicitly set. This fixes problems people were having loading
									the character- converter classes that didn't always exist (JVM
									bug). (thanks to Fritz Elfert for pointing out this problem)</p></li>
							<li class="listitem"><p>Changed MysqlIO to re-use
									packets where possible to reduce memory usage.</p></li>
							<li class="listitem"><p>Fixed escape-processor bugs
									pertaining to {} inside quotation marks.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-2a"></a>A.6.2. Changes in MySQL Connector/J
									1.2a (14 April 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed character-set support for
									non-Javasoft JVMs (thanks to many people for pointing it out)</p></li>
							<li class="listitem"><p>Fixed ResultSet.getBoolean() to
									recognize 'y' &amp; 'n' as well as '1' &amp; '0' as boolean
									flags. (thanks to Tim Pizey)</p></li>
							<li class="listitem"><p>Fixed ResultSet.getTimestamp()
									to give better performance. (thanks to Richard Swift)</p></li>
							<li class="listitem"><p>Fixed getByte() for numeric
									types. (thanks to Ray Bellis)</p></li>
							<li class="listitem"><p>Fixed
									DatabaseMetaData.getTypeInfo() for DATE type. (thanks to Paul
									Johnston)</p></li>
							<li class="listitem"><p>Fixed EscapeProcessor for "fn"
									calls. (thanks to Piyush Shah at locomotive.org)</p></li>
							<li class="listitem"><p>Fixed EscapeProcessor to not do
									extraneous work if there are no escape codes. (thanks to Ryan
									Gustafson)</p></li>
							<li class="listitem"><p>Fixed Driver to parse URLs of
									the form "jdbc:mysql://host:port" (thanks to Richard Lobb)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1i"></a>A.6.3. Changes in MySQL Connector/J
									1.1i (24 March 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed Timestamps for
									PreparedStatements</p></li>
							<li class="listitem"><p>Fixed null pointer exceptions in
									RSMD and RS</p></li>
							<li class="listitem"><p>Re-compiled with jikes for valid
									class files (thanks ms!)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1h"></a>A.6.4. Changes in MySQL Connector/J
									1.1h (08 March 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed escape processor to deal
									with unmatched { and } (thanks to Craig Coles)</p></li>
							<li class="listitem"><p>Fixed escape processor to create
									more portable (between DATETIME and TIMESTAMP types)
									representations so that it will work with BETWEEN clauses.
									(thanks to Craig Longman)</p></li>
							<li class="listitem"><p>MysqlIO.quit() now closes the
									socket connection. Before, after many failed connections some
									OS's would run out of file descriptors. (thanks to Michael
									Brinkman)</p></li>
							<li class="listitem"><p>Fixed NullPointerException in
									Driver.getPropertyInfo. (thanks to Dave Potts)</p></li>
							<li class="listitem"><p>Fixes to MysqlDefs to allow all
									*text fields to be retrieved as Strings. (thanks to Chris at
									Leverage)</p></li>
							<li class="listitem"><p>Fixed setDouble in
									PreparedStatement for large numbers to avoid sending scientific
									notation to the database. (thanks to J.S. Ferguson)</p></li>
							<li class="listitem"><p>Fixed getScale() and
									getPrecision() in RSMD. (contrib'd by James Klicman)</p></li>
							<li class="listitem"><p>Fixed getObject() when field was
									DECIMAL or NUMERIC (thanks to Bert Hobbs)</p></li>
							<li class="listitem"><p>DBMD.getTables() bombed when
									passed a null table-name pattern. Fixed. (thanks to Richard
									Lobb)</p></li>
							<li class="listitem"><p>Added check for "client not
									authorized" errors during connect. (thanks to Hannes
									Wallnoefer)</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1g"></a>A.6.5. Changes in MySQL Connector/J
									1.1g (19 February 1999)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Result set rows are now byte
									arrays. Blobs and Unicode work bidirectonally now. The
									useUnicode and encoding options are implemented now.</p></li>
							<li class="listitem"><p>Fixes to PreparedStatement to
									send binary set by setXXXStream to be sent untouched to the
									MySQL server.</p></li>
							<li class="listitem"><p>Fixes to
									getDriverPropertyInfo().</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1f"></a>A.6.6. Changes in MySQL Connector/J
									1.1f (31 December 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Changed all ResultSet fields to
									Strings, this should allow Unicode to work, but your JVM must
									be able to convert between the character sets. This should also
									make reading data from the server be a bit quicker, because
									there is now no conversion from StringBuffer to String.</p></li>
							<li class="listitem"><p>Changed
									PreparedStatement.streamToString() to be more efficient (code
									from Uwe Schaefer).</p></li>
							<li class="listitem"><p>URL parsing is more robust
									(throws SQL exceptions on errors rather than
									NullPointerExceptions)</p></li>
							<li class="listitem"><p>PreparedStatement now can
									convert Strings to Time/Date values using setObject() (code
									from Robert Currey).</p></li>
							<li class="listitem"><p>IO no longer hangs in
									Buffer.readInt(), that bug was introduced in 1.1d when changing
									to all byte-arrays for result sets. (Pointed out by Samo Login)
								</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1b"></a>A.6.7. Changes in MySQL Connector/J
									1.1b (03 November 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixes to DatabaseMetaData to
									allow both IBM VA and J-Builder to work. Let me know how it
									goes. (thanks to Jac Kersing)</p></li>
							<li class="listitem"><p>Fix to ResultSet.getBoolean()
									for NULL strings (thanks to Barry Lagerweij)</p></li>
							<li class="listitem"><p>Beginning of code cleanup, and
									formatting. Getting ready to branch this off to a parallel
									JDBC-2.0 source tree.</p></li>
							<li class="listitem"><p>Added "final" modifier to
									critical sections in MysqlIO and Buffer to allow compiler to
									inline methods for speed.</p></li>
						</ul>
					</div>
					<p>9-29-98</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>If object references passed to
									setXXX() in PreparedStatement are null, setNull() is
									automatically called for you. (Thanks for the suggestion goes
									to Erik Ostrom)</p></li>
							<li class="listitem"><p>setObject() in PreparedStatement
									will now attempt to write a serialized representation of the
									object to the database for objects of Types.OTHER and objects
									of unknown type.</p></li>
							<li class="listitem"><p>Util now has a static method
									readObject() which given a ResultSet and a column index will
									re-instantiate an object serialized in the above manner.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-1"></a>A.6.8. Changes in MySQL Connector/J
									1.1 (02 September 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Got rid of "ugly hack" in
									MysqlIO.nextRow(). Rather than catch an exception,
									Buffer.isLastDataPacket() was fixed.</p></li>
							<li class="listitem"><p>Connection.getCatalog() and
									Connection.setCatalog() should work now.</p></li>
							<li class="listitem"><p>Statement.setMaxRows() works, as
									well as setting by property maxRows. Statement.setMaxRows()
									overrides maxRows set using properties or url parameters.</p></li>
							<li class="listitem"><p>Automatic re-connection is
									available. Because it has to "ping" the database before each
									query, it is turned off by default. To use it, pass in
									"autoReconnect=true" in the connection URL. You may also change
									the number of reconnect tries, and the initial timeout value
									using "maxReconnects=n" (default 3) and "initialTimeout=n"
									(seconds, default 2) parameters. The timeout is an exponential
									backoff type of timeout; for example, if you have initial
									timeout of 2 seconds, and maxReconnects of 3, then the driver
									will timeout 2 seconds, 4 seconds, then 16 seconds between each
									re-connection attempt.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-1-0"></a>A.6.9. Changes in MySQL Connector/J
									1.0 (24 August 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed handling of blob data in
									Buffer.java</p></li>
							<li class="listitem"><p>Fixed bug with authentication
									packet being sized too small.</p></li>
							<li class="listitem"><p>The JDBC Driver is now under the
									LGPL</p></li>
						</ul>
					</div>
					<p>8-14-98</p>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed Buffer.readLenString() to
									correctly read data for BLOBS.</p></li>
							<li class="listitem"><p>Fixed
									PreparedStatement.stringToStream to correctly read data for
									BLOBS.</p></li>
							<li class="listitem"><p>Fixed
									PreparedStatement.setDate() to not add a day. (above fixes
									thanks to Vincent Partington)</p></li>
							<li class="listitem"><p>Added URL parameter parsing
									(?user=... and so forth).</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-0-9d"></a>A.6.10. Changes in MySQL Connector/J
									0.9d (04 August 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Big news! New package name. Tim
									Endres from ICE Engineering is starting a new source tree for
									GNU GPL'd Java software. He's graciously given me the
									org.gjt.mm package directory to use, so now the driver is in
									the org.gjt.mm.mysql package scheme. I'm "legal" now. Look for
									more information on Tim's project soon.</p></li>
							<li class="listitem"><p>Now using dynamically sized
									packets to reduce memory usage when sending commands to the DB.
								</p></li>
							<li class="listitem"><p>Small fixes to getTypeInfo() for
									parameters, and so forth.</p></li>
							<li class="listitem"><p>DatabaseMetaData is now fully
									implemented. Let me know if these drivers work with the various
									IDEs out there. I've heard that they're working with JBuilder
									right now.</p></li>
							<li class="listitem"><p>Added JavaDoc documentation to
									the package.</p></li>
							<li class="listitem"><p>Package now available in .zip or
									.tar.gz.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-0-9"></a>A.6.11. Changes in MySQL Connector/J
									0.9 (28 July 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Implemented getTypeInfo().
									Connection.rollback() now throws an SQLException per the JDBC
									spec.</p></li>
							<li class="listitem"><p>Added PreparedStatement that
									supports all JDBC API methods for PreparedStatement including
									InputStreams. Please check this out and let me know if anything
									is broken.</p></li>
							<li class="listitem"><p>Fixed a bug in ResultSet that
									would break some queries that only returned 1 row.</p></li>
							<li class="listitem"><p>Fixed bugs in
									DatabaseMetaData.getTables(), DatabaseMetaData.getColumns() and
									DatabaseMetaData.getCatalogs().</p></li>
							<li class="listitem"><p>Added functionality to Statement
									that enables executeUpdate() to store values for IDs that are
									automatically generated for AUTO_INCREMENT fields. Basically,
									after an executeUpdate(), look at the SQLWarnings for warnings
									like "LAST_INSERTED_ID = 'some number', COMMAND = 'your SQL
									query'". If you are using AUTO_INCREMENT fields in your tables
									and are executing a lot of executeUpdate()s on one Statement,
									be sure to clearWarnings() every so often to save memory.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-0-8"></a>A.6.12. Changes in MySQL Connector/J
									0.8 (06 July 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Split MysqlIO and Buffer to
									separate classes. Some ClassLoaders gave an IllegalAccess error
									for some fields in those two classes. Now mm.mysql works in
									applets and all classloaders. Thanks to Joe Ennis
									&lt;jce@mail.boone.com&gt; for pointing out the problem and
									working on a fix with me.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-0-7"></a>A.6.13. Changes in MySQL Connector/J
									0.7 (01 July 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>Fixed DatabaseMetadata problems
									in getColumns() and bug in switch statement in the Field
									constructor. Thanks to Costin Manolache
									&lt;costin@tdiinc.com&gt; for pointing these out.</p></li>
						</ul>
					</div>
				</div>
				<div class="section">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title">
									<a name="cj-news-0-6"></a>A.6.14. Changes in MySQL Connector/J
									0.6 (21 May 1998)
								</h3>
							</div>
						</div>
					</div>
					<div class="itemizedlist">
						<ul class="itemizedlist" style="list-style-type: disc;">
							<li class="listitem"><p>
									Incorporated efficiency changes from Richard Swift
									&lt;Richard.Swift@kanatek.ca&gt; in
									<code class="literal">MysqlIO.java</code>
									and
									<code class="literal">ResultSet.java</code>
									:
								</p></li>
							<li class="listitem"><p>We're now 15% faster than gwe's
									driver.</p></li>
							<li class="listitem"><p>
									Started working on
									<code class="literal">DatabaseMetaData</code>
									.
								</p></li>
							<li class="listitem"><p>The following methods are
									implemented:</p>
								<div class="itemizedlist">
									<ul class="itemizedlist" style="list-style-type: circle;">
										<li class="listitem"><p>
												<code class="function">getTables()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="function">getTableTypes()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="function">getColumns()</code>
											</p></li>
										<li class="listitem"><p>
												<code class="function">getCatalogs()</code>
											</p></li>
									</ul>
								</div></li>
						</ul>
					</div>
				</div>
			</div>
		</div>
		<div class="appendix">
			<div class="titlepage">
				<div>
					<div>
						<h1 class="title">
							<a name="connector-j-third-party-licenses"></a>Appendix B. Licenses
							for Third-Party Components
						</h1>
					</div>
				</div>
			</div>
			<div class="toc">
				<p>
					<b>Table of Contents</b>
				</p>
				<dl>
					<dt>
						<span class="section"><a href="#license-ant-contrib">B.1.
								Ant-Contrib License</a></span>
					</dt>
					<dt>
						<span class="section"><a href="#license-slf4j">B.2.
								Simple Logging Facade for Java (SLF4J) License</a></span>
					</dt>
				</dl>
			</div>
			<h2>
				<a name="id598188"></a>MySQL Connector/J
			</h2>
			<div class="itemizedlist">
				<ul class="itemizedlist" style="list-style-type: disc;">
					<li class="listitem"><p>
							<a class="xref" href="#license-ant-contrib"
								title="B.1. Ant-Contrib License">Section B.1, “Ant-Contrib
								License”</a>
						</p></li>
					<li class="listitem"><p>
							<a class="xref" href="#license-slf4j"
								title="B.2. Simple Logging Facade for Java (SLF4J) License">Section B.2,
								“Simple Logging Facade for Java (SLF4J) License”</a>
						</p></li>
				</ul>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="license-ant-contrib"></a>B.1. Ant-Contrib License
							</h2>
						</div>
					</div>
				</div>
				<p>The following software may be included in this product:
					Ant-Contrib</p>
				<pre class="programlisting">Ant-Contrib 
Copyright (c) 2001-2003 Ant-Contrib project. All rights reserved. 
Licensed under the Apache 1.1 License Agreement, a copy of which is reproduced below. 

The Apache Software License, Version 1.1 

Copyright (c) 2001-2003 Ant-Contrib project.  All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer. 

 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

 3. The end-user documentation included with the redistribution, if
    any, must include the following acknowlegement:  
       "This product includes software developed by the 
        Ant-Contrib project (http://sourceforge.net/projects/ant-contrib)."
    Alternately, this acknowlegement may appear in the software itself,
    if and wherever such third-party acknowlegements normally appear.

 4. The name Ant-Contrib must not be used to endorse or promote
    products derived from this software without prior written
    permission. For written permission, please contact
    ant-contrib-developers@lists.sourceforge.net.

 5. Products derived from this software may not be called "Ant-Contrib"
    nor may "Ant-Contrib" appear in their names without prior written
    permission of the Ant-Contrib project.

 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED.  IN NO EVENT SHALL THE ANT-CONTRIB PROJECT OR ITS
 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 SUCH DAMAGE.</pre>
			</div>
			<div class="section">
				<div class="titlepage">
					<div>
						<div>
							<h2 class="title" style="clear: both">
								<a name="license-slf4j"></a>B.2. Simple Logging Facade for Java
								(SLF4J) License
							</h2>
						</div>
					</div>
				</div>
				<p>The following software may be included in this product:</p>
				<pre class="programlisting">Simple Logging Facade for Java (SLF4J) 

Copyright (c) 2004-2008 QOS.ch 
All rights reserved. 

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software 
and associated documentation files (the "Software"), 
to deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, subject to the 
following conditions: 

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions 
of the Software. 

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY 
OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
OR OTHER DEALINGS IN THE SOFTWARE.</pre>
			</div>
		</div>
	</div>
	<div class="copyright-footer">
		Copyright © 1997, 2012, Oracle and/or its affiliates. All rights
		reserved. <a href="#legalnotice">Legal Notices</a>
	</div>
</body>
</html>
